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