代码之家  ›  专栏  ›  技术社区  ›  Rob Packwood

如何在EntityFramework4.0中从web.Config动态加载连接字符串?

  •  1
  • Rob Packwood  · 技术社区  · 16 年前

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

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

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

    1 回复  |  直到 16 年前
        1
  •  3
  •   Bryan Watts    16 年前

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

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

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

    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

    (此答案仅适用于生产代码。无参数构造函数技巧在类似于短暂代码的概念证明中非常有用。)