我对基于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?
解决方法
如果有其他人遇到这个问题,这就是我如何解决它:
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()) { ... }
您也可以将工厂方法设置为静态而不用担心注入,但我这样做是为了便于测试.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。