我主要使用我的dbcontext使用这样的语句:
using (var context = new MyContext())
{
}
但后来我不得不添加一个带有更改数据库功能的项目。我发现我可以将dbcontext构造函数更改为:
public MyContext(string connectionstring)
: base(connectionstring)
{
}
我创建了一个带有connectionstring属性的类:
public static class DbAccessor
{
public static string ConnectionStringForContext { get; set; }
}
我在开头设置了这个属性,我的using语句如下所示:
using (var context = new MyContext(DbAccessor.ConnectionStringForContext)
{}
它可以工作,但我的连接字符串现在无处不在,我觉得我不应该用连接字符串来做。有没有更好的方法呢?如果我想更改它们,处理我的连接字符串的最佳方法是什么?我应该停止使用这些使用语句吗?
我见过这个问题:Entity Framework change connection at runtime
但不同的是,我有一个正常运行的解决方案,但我不想在任何地方都有我的连接字符串。如果我在每个using语句中使用了该扩展方法。这几乎就像我的解决方案在每个使用声明中只有一行......
答案 0 :(得分:2)
您可以在上下文中尝试使用连接字符串的静态工厂方法(或您喜欢的工厂类),如下所示:
public class MyContext : ...
{
public MyContext(string connectionstring)
: base(connectionstring)
{
}
public static MyContext Create()
{
return new MyContext(DbAccessor.ConnectionStringForContext);
}
}
然后您可以像这样创建上下文:
using (var context = MyContext.Create())
{
}
答案 1 :(得分:1)
如果我理解正确,您需要能够支持连接到多个数据库的应用程序。你可以这样做,但是在你的DBAccessor
类中说两个属性,删除集合并从配置中获取相关连接,这样你的配置总是在应用程序配置中维护。
public static class DbAccessor
{
public static string ConnectionStringForDBOne { get { return ConfigurationManager.ConnectionStrings["DBOne"].ConnectionString} }
public static string ConnectionStringForDBTwo { get { return ConfigurationManager.ConnectionStrings["DBTwo"].ConnectionString} }
}
然后添加一些静态创建者以使生活更轻松:
public MyContext(string connectionstring)
: base(connectionstring)
{
public static MyContext CreateContextDBOne()
{
return new MyContext(DbAccessor.ConnectionStringForDBOne);
}
public static MyContext CreateContextDBTwo()
{
return new MyContext(DbAccessor.ConnectionStringForDBTwo);
}
}
然后在代码中使用它们:
using (var context = MyContext.CreateContextDBOne())
{
}
using (var context = MyContext.CreateContextDBTwo())
{
}
答案 2 :(得分:0)
你有一个连接字符串的地方,没关系。
如果您想要更改连接字符串,则只更改DbAccessor.ConnectionStringForContext
,这很好。
或者,如果您不想在构造函数中使用param,则可以尝试使用此question解决方案。