2015-02-09 70 views
5

我有以下問題。我正在使用實體框架6,我希望能夠在運行時或至少更改使用的數據庫,我希望能夠在選項中輸入時檢查連接信息。我的問題是我們想要支持MySql和LocalDB v12.0這麼簡單的交換連接字符串在這裏沒有幫助 - 我必須交換ExecutionStrategy和ConnectionFactory。EntityFramwork,使用多個數據庫/連接

EF似乎鎖定了所有配置,所以我無法在運行時更改它,是否有此工作周?目前,我試圖創建幾個DbConfiguration,併爲每個配置派生一個上下文,定義爲[DbConfigurationType(typeof(LocalDbConfigruation))]

我預計會失敗,但我thougt這將是值得一試;)

也許還有人在那裏誰可以幫我做一些的竅門和技巧。

回答

0

好的,現在問題似乎已經解決了。我正在使用DbConnections。

public MyContext() : base(ConnectionManager.Connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

public MyContext(DbConnection connection) : base(connection, true) 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
    Configuration.ProxyCreationEnabled = false; 
} 

我在一個特殊的類中創建了DbConnection,我認爲這不適合在這裏發佈代碼。但它基本上是這樣的:

DbConnection conn = null; 

switch (Type) 
{ 
    case ConnectionType.LocalDB: 
     conn = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection(); 
     break; 
    case ConnectionType.MySql: 
     conn = DbProviderFactories.GetFactory("MySql.Data.MySqlClient").CreateConnection(); 
     break; 
    default: 
     throw new System.InvalidOperationException(); 
} 

conn.ConnectionString = "Add provider specific connection string here"; 

然後,你只需要將代碼somhow給上下文。在我的情況下,我有一個ConnectionManager,當我調用MyContext()時讀取「默認連接」,並且還有第二個Ctor,我稱它爲「測試連接」。

1

還有一個選擇是利用基礎上下文。 在下面的例子中,我使用MSSQL連接和Oracle連接。 無論您希望使用多種數據庫連接類型,都可以擴展基本上下文。這種方法會帶來很多其他很多可能性,但它也應該適用於您的情況。

BaseContext.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    public class BaseContext<TContext> : DbContext where TContext : DbContext 
    { 
     static BaseContext() 
     { 
      Database.SetInitializer<TContext>(null); 
     } 

     public BaseContext(string connectionString = "Name=MSSQLEntities") 
      : base(connectionString) 
     {} 
    } 
} 

MSSQLModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context will use default MSSQLEntities connection 
    public class MSSQLContext : BaseContext<MSSQLContext> 
    { 
     ...apply DbSet<> and other loveliness...   
    } 
} 

OracleModel.cs

using System.Data.Entity; 

namespace MultipleConnections.Models 
{ 
    // Extending Base Context 
    public class OracleContext : BaseContext<OracleContext> 
    { 
     // Declare Oracle connection in Constructor to override default 
     // MSSQL connection 
     public OracleContext() 
      : base("Name=OracleEntities") 
     { } 
     ...apply DbSet<> and other loveliness...   
    } 
} 
+0

謝謝你,我會考慮使用你的soluition,看起來相當不錯:) – SirBirne 2015-02-17 10:10:14