是否可以从不同的连接字符串加载相同的上下文? [英] Is it possible to load in a same context from differents connection string?
问题描述
是否可以从不同的连接字符串加载到相同的上下文中?
我有4个相同的数据库。结构相同但每个都包含特定数据。我有上下文。
Namespace.Data.dbContext dbContext_1 = new Namespace.Data.dbContext();
Namespace.Data.dbContext dbContext_2 = new Namespace.Data.dbContext();
Namespace.Data.dbContext dbContext_3 = new Namespace.Data.dbContext();
Namespace.Data.dbContext dbContext_4 = new Namespace.Data.dbContext();
但在我的配置文件中我有这个
< add name = dbContext_1 connectionString = ... providerName = System.Data.EntityClient / >
< add 名称 = dbCont ext_2 connectionString = ... providerName = System.Data.EntityClient / < span class =code-keyword>>
< add 名称 = dbContext_3 connectionString = ... providerName = System.Data.E ntityClient / >
< add name = dbContext_4 connectionString = ... providerName = System.Data.EntityClient / >
我得到一个例外,因为实体框架告诉我它没有找到dbContext的连接字符串。
看来EF默认加载带有类名的连接字符串。正确?如何让它加载其他连接字符串?
FYI我使用EntityFramework 6并使用T4模板生成我的DbContext。
我尝试了什么:
我已经尝试加载其他连接字符串了
Namespace.Data.dbContext dbContext_1 = new Namespace.Data.dbContext(dbContext_1);
Namespace.Data.dbContext dbContext_2 = new Namespace.Data .dbContext(dbContext_2);
Namespace.Data.dbContext dbContext_3 = new Namespace.Data.dbContext(dbContext_3);
Namespace.Data.dbContext dbContext_4 = new Namespace.Data.dbContext(dbContext_4);
或
Namespace.Data.dbContext dbContext_1 = Namespace.Data.dbContext。???;
Namespace.Data.dbContext dbContext_2 = Namespace.Data.dbContext。???;
Namespace.Data.dbContext dbContext_3 = Namespace.Data.dbContext。???;
Namespace.Data.dbContext dbContext_4 = Namespace.Data.dbContext.????
因此您可以使用DbContext定位连接字符串,但是您需要确保您的类实现具有接受字符串参数并将其传递给基础构造函数的构造函数。您还需要手动访问连接字符串。你派生的DbContext需要看起来像这样:
public class MyDbContext:DbContext
{
... // DbSets and whatnot
public MyDbContext( string connStr): base (connStr)
{
// < span class =code-comment>任何其他所需的构造函数逻辑
}
}
现在你可以分离一个小工厂类,它将返回带有相应连接目标的DbContext副本。此示例中没有弹性,如果您想拥有默认的返回上下文,可以使用默认返回替换该异常。
public class DbSelector
{
public static MyDbContext GetContext( string name)
{
var connStrConfig = ConfigurationManager.ConnectionStrings [name];
if (connStrConfig!= null
&& !string.IsNullOrWhitespace(connStrConfig.ConnectionString))
{
return new MyDbContext (connStrConfig.ConnectionString);
} 其他 {
throw new 异常( 请求无效的配置字符串。);
}
}
}
从那里,获得有针对性的MyDbContext很简单。 />
DbSelector.GetContext( dbContext_1\" 跨度>);
Is it possible to load in a same context from differents connection string?
I have 4 identical databases. Identical in structure but each of them contains specific data. I have on context.
Namespace.Data.dbContext dbContext_1 = new Namespace.Data.dbContext();
Namespace.Data.dbContext dbContext_2 = new Namespace.Data.dbContext();
Namespace.Data.dbContext dbContext_3 = new Namespace.Data.dbContext();
Namespace.Data.dbContext dbContext_4 = new Namespace.Data.dbContext();
but in my config file I have this
<add name="dbContext_1" connectionString="..." providerName="System.Data.EntityClient"/>
<add name="dbContext_2" connectionString="..." providerName="System.Data.EntityClient"/>
<add name="dbContext_3" connectionString="..." providerName="System.Data.EntityClient"/>
<add name="dbContext_4" connectionString="..." providerName="System.Data.EntityClient"/>
And I get an exception because Entity Framework tell me it doesn't find the connection string for dbContext.
It seems EF load by default a connection string with his class name. Correct? How can I make it load other connection string?
FYI I use EntityFramework 6 and I use T4 templates to generate my DbContext.
What I have tried:
I already tried to load my other connection strings by doing
Namespace.Data.dbContext dbContext_1 = new Namespace.Data.dbContext("dbContext_1");
Namespace.Data.dbContext dbContext_2 = new Namespace.Data.dbContext("dbContext_2");
Namespace.Data.dbContext dbContext_3 = new Namespace.Data.dbContext("dbContext_3");
Namespace.Data.dbContext dbContext_4 = new Namespace.Data.dbContext("dbContext_4");
Or
Namespace.Data.dbContext dbContext_1 = Namespace.Data.dbContext.???;
Namespace.Data.dbContext dbContext_2 = Namespace.Data.dbContext.???;
Namespace.Data.dbContext dbContext_3 = Namespace.Data.dbContext.???;
Namespace.Data.dbContext dbContext_4 = Namespace.Data.dbContext.???;
So you can target a connection string with a DbContext, but you need to make sure that your class implementation has a constructor that accepts a string parameter and passes it to the base constructor. You will also need to access the connection strings manually. Your derived DbContext will need to look something like this:
public class MyDbContext : DbContext { ... // DbSets and whatnot public MyDbContext(string connStr) : base(connStr) { // Any other needed constructor logic } }
Now you can spin off a little factory class that will return a copy of your DbContext with the appropriate connection target. There's no resilience in this sample, and if you want to have a default return context you can replace the exception with a default return.
public class DbSelector { public static MyDbContext GetContext(string name) { var connStrConfig = ConfigurationManager.ConnectionStrings[name]; if(connStrConfig != null && !string.IsNullOrWhitespace(connStrConfig.ConnectionString)) { return new MyDbContext(connStrConfig.ConnectionString); }else{ throw new Exception("Invalid Configuration String requested."); } } }
From there, getting a targeted MyDbContext is simple.
DbSelector.GetContext("dbContext_1");
这篇关于是否可以从不同的连接字符串加载相同的上下文?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!