单例模式应该创建DBContext的多个实例但不是

时间:2013-09-29 07:45:54

标签: singleton entity-framework-5

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

1 个答案:

答案 0 :(得分: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 );
    }
}