在运行时更改DbContext使用的实体框架默认连接字符串

NoP*_*God 1 domain-driven-design entity-framework repository-pattern

我有一个使用实体框架的程序,根据运行它的计算机,它将通过网络连接到远程数据库或本地文件系统上的本地数据库.

使用实体框架,当我创建一个MyDbContext实例(它继承自实体框架的DbContext)时,它使用代码的第一个命名约定,并在app.config/web.config中查找具有相同名称(id)的连接字符串.类-ie .. MyDbContact.通常这是一个非常有用的约定,但它不适合我的特定用例.

当我的应用程序加载时,在任何查询发生之前,我想将命名连接字符串设置为我喜欢的字符串 - 即...远程数据库或本地连接字符串的连接字符串.

然后,MyDbContext的所有未来实例将自动获取我的自定义连接字符串.

我不想在web/app.config中对连接字符串进行硬编码.

该程序在很大程度上依赖于IoC /依赖注入并使用域驱动设计和存储库+服务模式,我也不希望必须将连接字符串指定为在向解析器注册它们时传递给每个存储库的参数( autofac).

对我来说,在实体框架中的某个地方必须有一个地方可以拦截这个代码,首先从web.config中检索连接字符串,然后传入一个自定义字符串.

我离开了,还是实际上有一种在运行时更改默认连接字符串的方法?

quj*_*jck 5

其中一个构造函数中的DbContext类接受一个字符串,字符串可以是一个连接字符串或连接字符串的名称.

要使用IoC来处理这个问题,您可以为连接字符串提供程序定义一个抽象,如下所示:

public interface IConnectionStringProvider
{
    string ConnectionString { get; }
}

public class MyContext : DbContext
{
    public MyContext(IConnectionStringProvider connectionStringProvider)
        : base(connectionStringProvider.ConnectionString)
    {
    }
}

public class ConnectionStringProvider : IConnectionStringProvider
{
    public ConnectionStringProvider()
    {
    }

    private string _connectionString = null;
    public string ConnectionString
    {
        get
        {
            if (_connectionString == null)
            {
                //initialise the connection string
                _connectionString = "Data Source=.;Initial Catalog ...";
            }
            return _connectionString;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)