【问题标题】:Ways to update dbfirst Entity Framework model at runtime在运行时更新 dbfirst Entity Framework 模型的方法
【发布时间】:2020-02-25 16:40:58
【问题描述】:

我想问一下是否可以在运行时更新数据库模型(例如列)?

我了解了 Entity Framework(在我的情况下必须使用数据库优先方法)或 Linq-to-SQL,但是当数据库表发生更改时,我必须手动更新应用程序的模型。

在我的应用程序中,我想使用 MVVM 模式,所以必须有一个模型类,它反映了一个数据库表。据我所知,我无法在运行时向类添加属性。

这是示例场景:

  1. 数据库表有3列:col1、col2、col3
  2. 模型类有 3 个属性:col1、col2、col3
  3. 使用实体框架,我可以轻松地从数据库中获取数据,然后将该数据绑定到控件,例如。数据网格
  4. 应用程序用户可以向数据库添加新列
  5. 还有一个问题。我找不到任何方法来刷新模型然后绑定到 DataGrid。

问题:是否有任何工具可以帮助我解决第 5 点的问题?

【问题讨论】:

  • 我相信您正在寻找的是 EF 迁移?
  • 这听起来更像是架构的问题。我永远不会允许用户向数据库添加新列。你想解决什么问题?也许有更好的方法。
  • @phuzi 应用程序必须对用户灵活。想象一下软件开发人员正在休假的情况。应用程序在这段时间内被阻塞,因为没有人将模型迁移到数据库。
  • 通常我已经看到这样的动态字段在单独的表或两个表中作为行实现 - 而不是通过修改应用程序。然后,您将在模型上拥有诸如 IList<CustomColumn> userColumns 之类的属性
  • 我建议应用程序需要能够在不修改代码的情况下处理这些自定义列这样做可能会降低性能,但你不能同时拥有这两种方式。

标签: c#


【解决方案1】:

我认为你不能用 EF 做到这一点。

你可以试试Dapper

执行查询并将其映射到动态对象列表

public static IEnumerable<dynamic> Query (this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)

此方法将执行 SQL 并返回一个动态列表。

示例用法:

 var rows = connection.Query("select 1 A, 2 B union all select 3, 4");

 Assert.Equal(1, (int)rows[0].A);
 Assert.Equal(2, (int)rows[0].B);
 Assert.Equal(3, (int)rows[1].A);
 Assert.Equal(4, (int)rows[1].B);

我仍然想要 EF

您可以以不同的方式映射数据。您可以将新数据映射为相关表中的新值类型,并将值存储为行而不是列,而不是新列。

这并不理想,因为您很可能最终将值存储为字符串,但它可以完成这项工作。

表格看起来像这样。

CREATE TABLE CustomerDetails(
    [CustomerId] [nvarchar](128) NOT NULL,
    [Name] [nvarchar](128) NOT NULL,
    [Value] [nvarchar](150) NOT NULL
    (... setup keys, constraints, etc)

当用户创建新列“ColumnX”时,该列的值将存储为带有Name = 'ColumnX' 的行。

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 2013-04-30
    • 2011-09-04
    • 2014-05-02
    • 2015-02-21
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多