0

同時に 2 つのデータベースに接続できる必要があります。データベースは同じ構造なので、同じコンテキストのインスタンスを 2 つ使用できるはずだと思います。しかし、私はそれを機能させることができません。2 番目のインスタンスの接続文字列を設定するとすぐに、最初のインスタンスの接続文字列がそれに一致するように変更されます。私が見逃しているEFについて何かありますか?

コンテキストを作成するための次のヘルパー クラスがあります。

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

次の方法で2つのコンテキストを作成すると

        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 に変更すると、コンテキスト初期化子で「静的コンテキストの非静的フィールドにアクセスできません」というエラーが表示されます

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

1 に答える 1

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 );
    }
}
于 2013-09-29T23:57:06.097 に答える