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

Entity framework 更改运行时DbContext使用的实体框架默认连接字符串,entity-framework,domain-driven-design,repository-pattern,Entity Framework,Domain Driven Design,Repository Pattern,我有一个使用实体框架的程序,根据它在哪台计算机上运行,它要么通过网络连接到远程数据库,要么通过本地文件系统连接到本地数据库 对于entity framework,当我创建从entity framework的DbContext继承的MyDbContext实例时,它使用代码优先命名约定,并将在app.config/web.config中查找与类id相同的连接字符串-ie。。MyDbContact。通常这是一个非常有用的约定,但它不适合我的特定用例 当我的应用程序加载时,在任何查询发生之前,我想将命名

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

对于entity framework,当我创建从entity framework的DbContext继承的MyDbContext实例时,它使用代码优先命名约定,并将在app.config/web.config中查找与类id相同的连接字符串-ie。。MyDbContact。通常这是一个非常有用的约定,但它不适合我的特定用例

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

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

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

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

在我看来,合乎逻辑的是,在实体框架的某个地方,必须有一个地方可以让您截取这个代码优先的约定,即从web.config检索连接字符串,而只是传入一个自定义字符串

我是不是太离谱了,或者实际上有没有办法在运行时更改默认连接字符串?

的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;
        }
    }
}
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;
        }
    }
}