2014-01-23 45 views
3

我見過不少文章,但我不明白如何實現這一點。我的連接字符串在app.config中被指定爲「MealsContext」,我的EF datamodel容器名稱是「MealsContext」,我如何使用MealsContext的實例但是定義了在運行時使用的連接字符串?如果我創建一個新的EntityConnection,它不知道模型中的實體對象是什麼,例如這是目前我在做什麼...動態設置EF 6連接字符串

private MealsContext context = new MealsContext(); 

public void InsertOrUpdate(Meal _entity) 
     { 
      context.Entry(_entity).State = _entity.Id == default(int) ? EntityState.Added : EntityState.Modified; 
      context.SaveChanges(); 
     } 
+6

我覺得有一個的DbContext構造函數,它允許你輸入一個連接字符串。 – TGlatzer

+0

看看這個http://stackoverflow.com/questions/4805094/pass-connection-string-to-code-first-dbcontext –

+0

我想你需要傳遞配置文件中的連接字符串的名稱,但連接字符串本身。 –

回答

1

EF 6對數據庫的上下文,DbContext基類,有幾個重載 - 其中之一需要一個DbConnection和布爾標誌,指示如果前面提到的DbConnection對象應該被設置當所述上下文被設置(IOW如果真當佈置上下文時佈置DbConnection)。你也可以使用構造函數重載,它只需要一個連接字符串,但我想拋出一個例子來說明如何在控制DbConnection對象的生命週期的時候這樣做。

當您的特定上下文被生成時,缺省情況下只有默認的(public/parameterless)構造函數可用,如果您查看生成的類,則會使用基於配置文件的EF連接字符串條目。好處是您從DbContext繼承的生成上下文遵循使用部分修飾符生成您的上下文類的最佳實踐,這允許您創建自己的partial實現您的特定模型的上下文。

我會建議建立在你的項目中的新類文件(明確不是生成的代碼文件),並在最低限度,使partial實現模型的上下文類的只具有DbConnectionbool參數的構造以反映前面提到的DbContext構造函數簽名。

例如,如果產生的上下文的定義是:

public partial class MyModelContainer : DbContext... 

,那麼你可以創建你的局部類實現(當然你有光澤,新的,獨立的類文件):

public partial class MyModelContainer 
{ 
    public MyModelContainer(DbConnection dbConnection, bool contextOwnsConnection) 
     : base(dbConnection, contextOwnsConnection) 
    { 
     // you can other stuff here if you need to, but don't have to for this example 
    } 
} 

如果您已經掌握了這一點,則應該可以創建MyModelContainer數據庫連接的對象,與您提供的DbConnection對象使用的連接字符串一樣動態。

例如:

public void DynamicConnectionExample(string entityConnectionString) 
{ 
    DbConnection dbConnection = new EntityConnection(entityConnectionString); 
    bool shouldImplicitlyDisposeOfConnection = true; 
    using (var ctx = new MyModelContext(dbConnection, shouldImplicitlyDisposeOfConnection)) 
    { 
     // do stuff... 
    } 
} 

很明顯,你可以得到一個小的創意與方法來配置的DbConnection對象的連接字符串,我會建議做探索比示例中所示的方式,使其他的方式。

另外值得注意的是:取決於你使用的是模型優先還是代碼優先,將會對你使用的DbConnection的專用類型產生影響。例如,如果您使用EF模型,則會使用EntityConnection對象,因爲您需要訪問程序集中的元數據編譯資源。

裁判:http://msdn.microsoft.com/en-us/library/gg696604(v=vs.113).aspx

1

萬一別人是找這個,我從幾個其他職位該說同樣的話拼湊答案在一起,但我沒有得到它首先。我在app.config文件中添加了幾個不同的命名連接字符串。然後我推翻上下文類是在實體模型,它需要連接字符串的名稱作爲參數

public MealsContext(string connectionString) : base(connectionString) 

{

}

我在傳遞的字符串是「 name = csTest「,其中csTest是app.config中定義的連接字符串。但是,訣竅是要將這個上下文分開指定 - 例如,在類庫文件夾中,以便在更新或重建模型時不會自動覆蓋上下文。