实体框架,对具有相同布局但不同表名的两个表使用相同的模型

时间:2013-02-06 21:08:05

标签: c# entity-framework model

我有两张具有相同布局的表格 -

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表的调用中,我得到了预期的结果。

我将连接字符串更改为指向第二个数据库,但我无法更改表映射中表的名称。

我不想出于我的评论中概述的原因使用存储过程。

如果没有数据库中的表名(不是选项),我该怎么办。

2 个答案:

答案 0 :(得分:2)

您是否尝试过这种流畅的API modelBuilder.Entity<Report>().ToTable("Reporting");?您可能需要编写此代码,以便根据您要连接的数据库有条件地执行此操作。您可能需要让配置允许您说“DatabaseA使用此映射和连接字符串”,“DatabaseB使用此其他映射和连接字符串”,而不是更改连接字符串,您可以通过某个名称/键指定哪个数据库,并且您的应用程序会查找该名称以确定要运行的映射代码。

if(dbMappingconfig == DbMapping.A)//some enum you create
{
    modelBuilder.Entity<Report>().ToTable("Reporting");
}

如果您的目标是能够将这些实体传递给其他方法(如DisplayReport(报表r)),以便您不必重复代码,则可以让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);

但这会带来额外的复杂性,因为您需要自己管理缓存。

在搜索此内容时,我发现这看起来似乎是在尝试完成同样的事情,并且在同一页面上,请参阅相关的最终部分: How to map an Entity framework model to a table name dynamically

答案 1 :(得分:1)

您是否能够在每个数据库中创建相同的命名视图并映射到该视图而不是变量表名称?

我的解决方案中有2个不同名称的表副本,并通过2个上下文和2个映射文件(生成的文本模板)处理它们