1

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

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

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

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

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

该程序严重依赖 IoC/依赖注入并使用域驱动设计和存储库+服务模式,我也不希望在向解析器注册时将连接字符串指定为要传递给每个存储库的参数(自动法)。

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

我是不是很远,或者实际上有一种方法可以在运行时更改默认连接字符串?

4

1 回答 1

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;
        }
    }
}
于 2013-06-07T09:17:58.493 回答