2013-09-29 30 views
0

我需要能夠同時連接到2個數據庫。數據庫具有相同的結構,所以我認爲我應該可以使用同一個上下文的兩個實例。但我無法得到它的工作。 只要爲第二個實例設置連接字符串,第一個實例的連接字符串就會更改爲匹配它。有什麼關於我缺少的EF?單例模式應該創建DBContext的多個實例,但不需要

我有下面的助手類來創建一個上下文。

public class SettingsHelper 
{ 
    private static SettingsHelper instance; 
    public static SettingsHelper Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new SettingsHelper(); 
      } 

      return instance; 
     } 
    } 

    public static Context CreateContext(string constr) 
    { 
     try 
     { 

      var db = new Context(constr); 
      return db; 
     } 
     catch (Exception ex) 
     { 
      HandleException.Show(ex); 
     } 
     return null; 
    } 
} 

實際的上下文類包含

public class Context : DbContext 
{ 
    public Context(string connString) 
     : base(connString) 
    { 
      // some code 
    } 
} 

如果我以下列方式

 using (Context firstContext = SettingsHelper.CreateContext("conn1")) 
     { 
       // firstContext has connection string "conn1" 
      using (Context secondContext = SettingsHelper.CreateContext("conn2" )) 
      { 
       // firstcontext now has the same connection string "conn2" 
      } 
     } 

conn1就和CONN2在app.config中定義創建兩個上下文

這裏我的背景。 我不知道我的問題是因爲_connectionString是靜態的嗎?但是如果我將其改爲公開我得在上下文中的錯誤初始化器

public class Context : DbContext 
{ 
    static string _connectionString; 

    public Context() 
     : base(_connectionString ?? "Syrius") 
    { 
    } 

    public Context(string connString) 
     : base(connString) 
    { 
     _connectionString = connString; 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Migrations.Configuration>()); 
    } 

    public Context(string connString, int TimeOutSecs) 
     : base(connString) 
    { 
     _connectionString = connString; 
    } 

    public DbSet<Label> Labels { get; set; } 
    // etc 
} 
+0

問題是什麼?你想知道什麼? – Steven

+0

我編輯並澄清了這個問題 –

+0

你的代碼沒有問題。問題在於別的地方。 – Steven

回答

0

我設法通過創建一個全球性的連接字符串

public static class DataGlobals 
{ 
    private static string _connectionString = ""; 
    public static string ConnectionString 
    { 
     get { return _connectionString; } 
     set { _connectionString = value; } 
    } 
} 
來解決這個問題「不能在靜態情況下訪問非靜態字段」

我隨時隨地設置並呼叫全球。

也是我加了一個工廠方法

public class MyContextFactory : IDbContextFactory<Context> 
{ 
    public Context Create() 
    { 
     return new Context(DataGlobals.ConnectionString); 
    } 
} 
相關問題