实体框架:具有不相同结构的多个表的一个模型

时间:2017-04-03 19:57:40

标签: c# sql-server entity-framework

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

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

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

2 个答案:

答案 0 :(得分:0)

EF预期我不知道解决方案,但您可以尝试使用下面的扩展方法:

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

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

这不是按照方式测试的,但它可以让你知道我的意思。

答案 1 :(得分:0)

Entity Framework支持生成Table per Concrete类型映射,这使您可以拥有一个包含所有共享列的基类,以及每个特定表的派生类

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