【问题标题】:Entity Framework: One model for multiple tables with non identical structures实体框架:具有不同结构的多个表的一种模型
【发布时间】:2017-04-04 05:09:58
【问题描述】:

我有 50 多个具有几乎相同结构的数据表。一些表有额外的列。我正在开发一个应用程序来帮助我监视和跟踪对这些表中包含的数据的更改,并且只需要能够读取其中包含的数据。我想创建一个实体框架模型,该模型将与所有表一起使用,并允许我访问所有存在的列。

只要模型包含存在的列的子集,我的模型就可以工作的所有表,并且我可以在具有相同模型的表之间动态切换。但是,当它们存在时,我需要访问它们。当我的模型包含在我切换到的表中不存在的列时,我会收到无效列的异常。有没有办法让我的模型成为所有列的集合,如果该列在特定表的上下文中不存在,以我仍然可以访问存在的列的方式处理它?我知道使用海峡 SQL 我可以很容易地做到这一点,但我很好奇是否有一种方法可以使用实体框架来做到这一点。本质上,我正在寻找查询 sys.columns 的等价物来确定表的结构,然后根据知道 sys.columns 查询中存在哪些列与表进行交互。

问题示例: 50 多个表格包含来自不同县的数据。其中一些县包含了其他数据,例如图像或文件的 url 链接。因此,我有一个包含此链接的 varchar 列。许多县不提供此类属性,并且不在其他县的表格中。但是还有 100 个其他报告的属性在所有表之间是通用的。我意识到这个问题的解决方案是让所有表都包含所有可能的列。然而,在实践中,由于频繁更改以向某些县的客户提供更多服务,这很难实现。

【问题讨论】:

  • 最好有一个样本,你有什么样的差异。您可以拥有一个包含可为空列的大类/表,或者您可以使用继承

标签: c# sql-server entity-framework


【解决方案1】:

来自EF 的潜在客户,我不知道解决方案,但您可以尝试以下扩展方法:

public static DbRawSqlQuery<YourBaseModel> GetDataFromTable(this ApplicationDbContext context, string tableName)
{
     return context.Database.SqlQuery<YourBaseModel>("select * from " + tableName);
}

我认为这只会将表中存在的列与模型中的属性映射。

顺便说一下,这没有经过测试,但它可以让您了解我的意思。

【讨论】:

    【解决方案2】:

    实体框架支持为每个具体类型映射生成表,这让您拥有一个包含所有共享列的基类,以及每个特定表的派生类

    https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      相关资源
      最近更新 更多