2

我有两张布局相同的桌子 -

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());
}

在我调用第一个数据库报告表时,我得到了预期的结果。

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

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

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

4

2 回答 2

2

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

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

如果您的目标是能够将这些实体传递给 DisplayReport(Report 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);

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

在搜索这个时,我遇到了这个,看起来他们正在尝试完成相同的事情,并且已经进入同一页面,请参阅有问题的最后部分:如何将实体框架模型动态映射到表名

于 2013-02-06T21:28:03.323 回答
1

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

我的解决方案中有 2 个具有不同名称的表副本,并通过拥有 2 个上下文和 2 组地图文件(生成的文本模板)来处理它

于 2013-02-06T21:34:58.253 回答