你试过这个流畅的 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);
但这会带来额外的复杂性,因为您需要自己管理缓存。
在搜索这个时,我遇到了这个,看起来他们正在尝试完成相同的事情,并且已经进入同一页面,请参阅有问题的最后部分:如何将实体框架模型动态映射到表名