2011-11-10 75 views

回答

1

不是。架構是mapping file的一部分。所以選項是:

  • 不要使用映射文件作爲資源。在運行時更改SSDL文件。
  • 在運行時使用兩個不同的SSDL文件並構建連接字符串。
+0

或者如果MSFT實際上支持Model First,則MSFT可以構建此功能... – Dave

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 
    } 
} 

如果你的模型具有一定的相似性比你可以使用一些接口。如果您的模型共享一些共同屬性,即它們都具有Category對象,則爲模型提供兩個不同的名稱空間可解決此問題。

1

正如Ladislav所說,您可以使用兩個SSDL文件,

以下是如何操作。

  • 右鍵單擊您的.edmx文件,然後選擇屬性
  • 變化「元數據神器處理」到複製到輸出目錄
  • 從你的輸出目錄打開.ssdl文件
  • 全部更換模式= 「DBO」架構= 「A」
  • 保存文件作爲a.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';「;

0

這是我對類似的情景(非常類似於@Greatran的答案,但我找不到我的.edmx文件的任何元神器處理屬性項):

  1. 構建至少一次包含EDMX項目文件
  2. 搶生成.SSDL文件的副本,包含在
    Your\Project\Folder\obj\Debug\edmxResourcesToEmbed\Your\EDMX\Namespace\
  3. 複製的子路徑,包括你的項目下,如在與EDMX文件相同的目錄中:...\Your\EDMX\Namespace\MyModel.ssdl
  4. 重命名它,添加一個後綴以匹配您的部署環境,例如,對於Debug環境這將是MyModel.Debug.ssdl
  5. 從它的文件屬性,設置生成操作Embedded Resource
  6. 抓住從Web項目Web.config文件相關的上下文的連接字符串的副本。這應該是像
connectionString="metadata=res://\*/XXXXX.MyModel.csdl| 
res://*/XXXXX.MyModel.ssdl| 
res://*/XXXXX.MyModel.msl; 
provider=ZZZZZ;provider connection string='AAAAA'"
  1. 變換連接字符串爲您的部署環境中的web項目的配置文件,說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'部分以匹配部署環境中的數據庫服務器。