到現在爲止(EFv1)我們使用此解決方案:http://efmodeladapter.codeplex.com/ 升級到.NET Framework 4.0後,我們正在尋找內置的方式來在運行時更改架構實體框架4.0/4.1?實體框架4.1:有沒有辦法在運行時切換架構
爲了更具體,我們在DB(A和B)上有兩個大模式,只有模式A被添加到模型中。 A和B中的表格完全相同。 我正在尋找解決方案來在運行時在A和B之間切換。
到現在爲止(EFv1)我們使用此解決方案:http://efmodeladapter.codeplex.com/ 升級到.NET Framework 4.0後,我們正在尋找內置的方式來在運行時更改架構實體框架4.0/4.1?實體框架4.1:有沒有辦法在運行時切換架構
爲了更具體,我們在DB(A和B)上有兩個大模式,只有模式A被添加到模型中。 A和B中的表格完全相同。 我正在尋找解決方案來在運行時在A和B之間切換。
不是。架構是mapping file的一部分。所以選項是:
我可以分別建議你兩種模式。並根據條件使用其中一種或另一種。 例如
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
}
}
如果你的模型具有一定的相似性比你可以使用一些接口。如果您的模型共享一些共同屬性,即它們都具有Category
對象,則爲模型提供兩個不同的名稱空間可解決此問題。
正如Ladislav所說,您可以使用兩個SSDL文件,
以下是如何操作。
使用以下連接字符串初始化您的DbContext
metadata =〜/ bin/Model1.csdl |〜/ bin/a.ssdl |〜/ bin/Model1.msl; provider = System.Data.SqlClient;提供程序連接字符串='data source =。\ SQLEXPRESS; initial catalog =; integrated security = True; multipleactiveresultsets = True; App = EntityFramework';「;
這是我對類似的情景(非常類似於@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'
部分以匹配部署環境中的數據庫服務器。
c# Entity Framework EF 4.1 Change Schema and Database name at runtime的解決方案效果很好。它基本上在運行時更改SSDL資源中的模式,因此不需要爲每個使用的模式生成新的SSDL。
或者如果MSFT實際上支持Model First,則MSFT可以構建此功能... – Dave