到目前为止(EFv1)我们使用了这个解决方案:http://efmodeladapter.codeplex.com/ 在升级到.NET Framework 4.0之后,我们正在寻找在使用Entity Framework 4.0 / 4.1时在运行时更改架构的内置方法吗?
更具体地说,我们在DB(A和B)上有两个大模式,只有模式A添加到模型中。 A和B中的表格完全相同。 我正在寻找一种在运行时间在A和B之间切换的解决方案。
答案 0 :(得分:1)
没有。架构是mapping file的一部分。所以选项是:
答案 1 :(得分:1)
我可以分别建议你两个型号。并根据条件使用一个或另一个。 例如
void Foo(DbContext model) {
if (model.GetType() == typeof(FooNamespace.MyFooModel)){
var db = model as FooNamespace.MyFooModel;
//Do stuff
} else {
var db = model as BarNamespace.MyBarModel;
//Do stuff
}
}
如果你的模型有一些相似之处,你可以使用一些界面。如果你的模型共享一些commone属性,即它们都有Category
个对象,那么为模型设置两个不同的命名空间就可以解决问题。
答案 2 :(得分:1)
正如Ladislav所说,你可以使用两个SSDL文件,
这是怎么做的。
使用以下连接字符串
初始化DbContextmetadata =〜/ bin / Model1.csdl |〜/ bin / a.ssdl |〜/ bin / Model1.msl; provider = System.Data.SqlClient; provider connection string ='data source =。\ SQLEXPRESS; initial catalog =; integrated security = True; multipleactiveresultsets = True; App = EntityFramework';“;
答案 3 :(得分:0)
这是我对类似场景的看法(非常类似于@Greatran答案,但我在.EDMX文件上找不到任何元数据工件处理属性项):
Your\Project\Folder\obj\Debug\edmxResourcesToEmbed\Your\EDMX\Namespace\
...\Your\EDMX\Namespace\MyModel.ssdl
Debug
环境,它将是MyModel.Debug.ssdl
Embedded Resource
Web.config
文件中获取相关上下文连接字符串的副本。这应该是connectionString="metadata=res://\*/XXXXX.MyModel.csdl| res://*/XXXXX.MyModel.ssdl| res://*/XXXXX.MyModel.msl; provider=ZZZZZ;provider connection string='AAAAA'"
Web.Debug.config
,以便用自定义SSDL文件替换EDMX生成的SSDL文件:connectionString="metadata=res://\*/XXXXX.MyModel.csdl| res://*/YYYYY.MyModel.Debug.ssdl| res://*/XXXXX.MyModel.msl; provider=ZZZZZ;provider connection string='BBBBB'"
最后一点可能会变得棘手,至少在我的经验中,因为EDMX生成的SSDL资源的命名空间与我的自定义SSDL资源的命名空间不同。为了获得我的自定义资源的确切命名空间,我在VS中运行了一个调试会话,并在立即窗口中检查了this.GetType().Assembly.GetManifestResourceNames()
的输出(感谢stu432)。
此外,我更改了connection string ='AAAAA'
部分以匹配部署环境中的数据库服务器。
答案 4 :(得分:0)
c# Entity Framework EF 4.1 Change Schema and Database name at runtime中的解决方案效果很好。它基本上在运行时更改SSDL资源中的模式,因此不需要为每个使用的模式生成新的SSDL。