我对基于EF6代码的配置的(稀疏)MSDN文档感到有些困惑。我有一个WPF应用程序,需要根据命令行参数和/或对话框中的用户输入创建SQL连接。在旧版本的EF中,我通过构建连接字符串并每次将其传递给派生的DbContext来实现此目的。
如果我能避免这样做会很好,因为它还意味着必须将连接字符串传递给需要使用上下文的每个视图模型。似乎EF6中的DbConfig正在实现这一目标。根据文档,我创建了一个自定义类,如下所示:
public class EfConfiguration: DbConfiguration
{
public EfConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
SetDefaultConnectionFactory(new SqlConnectionFactory());
SetDatabaseInitializer<DataContext>(null);
}
}
根据我的理解,EF会接收并做一些事情。但我的问题是,如何在应用程序运行后设置连接字符串?这样做是否意味着我现在可以在没有参数的情况下实例化我的DbContext?
答案 0 :(得分:1)
如果其他人遇到此问题,请按照以下方式解决问题:
DbContext有一个接受现有连接的构造函数。所以我的派生DbContext(在本例中称为Entities)有一个构造函数,如下所示:
public Entities(IConnectionHelper connHelper)
:base(connHelper.GetConnection(), true)
{ }
IConnectionHelper是一个注入的单例,它具有server / db / uname / pw的属性,在更改它们时,使用SqlConnectionStringBuilder构建内部连接字符串。由于它是一个单例,用户可以从对话框中修改属性,例如,它们仍然可以在其他任何地方访问。 GetConnection()方法从工厂创建连接:
SqlConnectionFactory connFactory = new SqlConnectionFactory(_connectionString);
return connFactory.CreateConnection(_connectionSettings.Database);
其中_connectionString只是我构建的字符串,而_connectionSettings只是一个包含各种连接参数的POCO。
然后为了实现DbContext的无参数构造的目标,我创建了一个简单的工厂,它将IConnectionHelper构造函数注入为依赖:
public EntitiesFactory(IConnectionHelper connHelper)
{
_connHelper = connHelper;
}
public Entities Create()
{
return new Entities(_connHelper);
}
我将这个工厂注入任何需要它的课程,然后它只是一个简单的问题:
using (var db = _entitiesFactory.Create())
{ ... }
您也可以将工厂方法设置为静态而不用担心注入,但我这样做是为了便于测试。
答案 1 :(得分:0)
只是想在这里发布我自己未来的谷歌搜索的好处,DBContext基类也有一个接受连接字符串的构造函数,所以你可以进入你的上下文文本模板并使用该构造函数:)
Easy Peasy