0

我需要能够同时连接到 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
     }
 }

如果我按以下方式创建两个上下文

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