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

时间:2013-06-07 08:24:29

标签: entity-framework domain-driven-design repository-pattern

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

DbContext类的

One of the constructors接受一个字符串,该字符串可以是连接字符串或连接字符串的名称。

要使用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;
        }
    }
}