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。

我能做什么,缺少数据库中的表名(这不是一个选项)。

Entity Framework,对布局相同但表名不同的两个表使用相同的模型

您尝试过这种流利的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组映射文件(生成的文本模板)

来处理这一问题