如何从Entity Framework 4.0中的web.Config动态加载连接字符串?

时间:2010-03-01 15:31:05

标签: c# entity-framework

在LinqToSql中,如果我将Connection字符串设置为(None),我可以编写一个空构造函数。在那个空构造函数中,我可以从web.Config中拉出连接字符串,如下所示:

    public CustomDataDataContext() :
  base( ConfigurationManager.ConnectionStrings[ "DB" ].ConnectionString, mappingSource )
{
  OnCreated();
}

我正在尝试在Entity Framework 4.0中做同样的事情。这有可能吗?我似乎无法摆脱他们生成的无表情构造函数。我宁愿不将上下文包装在一个新的类中,如果我不需要,它会将连接字符串提供给上下文。

1 个答案:

答案 0 :(得分:3)

虽然自动查找连接的无参数构造函数似乎是一个好主意,但它将对象上下文与配置文件紧密耦合。

它还引入了一些“魔力”,因为消费者没有明确的方法来确定如何更改与无参数构造函数关联的连接字符串(读取源代码除外)。

我想我的答案是,无论实体框架是否允许您这样做,您可能都不应该这样做。改为使用工厂,并在不将对象上下文绑定到配置系统的情况下实现相同的灵活性:

public interface ICustomDataContextFactory
{
    CustomDataContext Create();
}

public class CustomDataContextFactory : ICustomDataContextFactory
{
    private readonly string _connectionStringName;

    public CustomDataContextFactory(string connectionStringName)
    {
        _connectionStringName = connectionStringName;
    }

    public CustomDataContext Create()
    {
        var connectionString = ConfigurationManager.ConnectionStrings[_connectionStringName].ConnectionString;

        return new CustomDataContext(connectionString);
    }
}

这为所有使用者提供了创建无参数实例的相同机制,同时允许实现者决定如何创建实例 - 可能需要为特定实例使用不同的连接字符串,或者在启动时从命令行读取数据库名称。

我意识到你说你不想引入一个传递连接字符串的新类。我认为这意味着一个来自CustomDataContext而不是工厂的类,这是一个新概念。

(这个答案只适用于生产代码。无参数构造函数技巧在短暂的代码中非常有用,例如概念证明。)