加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用基于代码的配置在Entity Framework 6中设置连接

发布时间:2020-12-15 22:01:44 所属栏目:百科 来源:网络整理
导读:我对基于EF6代码的配置的(稀疏)MSDN文档感到困惑.我有一个 WPF应用程序,需要根据命令行参数和/或对话框中的用户输入创建SQL连接.在旧版本的EF中,我通过构建连接字符串并每次将其传递给我的派生DbContext来实现这一点. 如果我可以避免必须这样做会很好,因为它
我对基于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())
{ ... }

您也可以将工厂方法设置为静态而不用担心注入,但我这样做是为了便于测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读