Entity Framework,对布局相同但表名不同的两个表使用相同的模型
本文关键字:模型 两个 Framework 布局 Entity | 更新日期: 2023-09-27 17:58:08
我有两个布局相同的表-
Report Table
ID
ReportCol1
ReportCol2
在另一个数据库中,我有
Reporting Table
ID
ReportCol1
ReportCol2
我想使用一个名为Report
的单个实体模型来从这两个表加载数据。
在我的上下文类中,我有
public DbSet<Report> Report{ get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ReportMap());
}
在对第一个数据库Report表的调用中,我得到了预期的结果。
我更改了连接字符串以指向第二个数据库,但无法更改表映射中表的名称。
出于我在评论中概述的原因,我不想使用存储的proc。
我能做什么,缺少数据库中的表名(这不是一个选项)。
您尝试过这种流利的API modelBuilder.Entity<Report>().ToTable("Reporting");
吗?你可能需要写这个,这样它就可以根据你连接到的数据库有条件地这样做。你可能需要让你的配置允许你说"DatabaseA使用这个映射和连接字符串","DatabaseB使用这个其他映射和连接串",而不是更改连接字符串,而是通过一些名称/键指定哪个数据库,您的应用程序会查找该名称以确定要运行的映射代码。
if(dbMappingconfig == DbMapping.A)//some enum you create
{
modelBuilder.Entity<Report>().ToTable("Reporting");
}
如果你的目标是能够将这些实体传递给DisplayReport(Reportr)等其他方法,这样你就不必重复代码,那么你可以让Reporting和Report类都实现一个IReport接口。
EF还支持继承层次结构,因此您可以让它们从同一个类继承,但是我有一种强烈的感觉,不会在数据库中工作。
如果OnModelCreating没有重新运行,它可能已经被缓存了。把modelBuilder.CacheForContextType = false;
放在那里,这样它将来就不会缓存它了,为了清除当前的缓存,我认为你可以进行Clean+Rebuild。这将以每次重建模型而不是重用缓存为代价。您真正想要的是使用缓存,直到连接字符串发生更改。我不知道如何手动清除缓存,但可能有办法。您可以自己管理模型构建:
DbModelBuilder builder = new DbModelBuilder();
// Setup configurations
DbModel model = builder.Build(connection);
DbCompiledModel compiledModel = model.Compile();
DbContext context = new DbContext(connection, compiledModel);
但这将引入额外的复杂性,因为您需要自己管理缓存。
在搜索时,我发现他们似乎正在努力完成同样的事情,并且已经进入了同一页,请参阅最后一节:如何将实体框架模型动态映射到表名
您是否能够在每个数据库中创建相同的命名视图并映射到该视图,而不是变量表名?
在我的解决方案中,我有两个不同名称的表的副本,并通过拥有2个上下文和2组映射文件(生成的文本模板)