繁体   English   中英

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

[英]How to dynamically load connection string from web.Config in Entity Framework 4.0?

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

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

我现在尝试在Entity Framework 4.0中执行相同的操作。 这有可能吗? 我似乎无法摆脱他们生成的无参数构造函数。 我宁愿不要将上下文包装在一个新的类中,如果不需要的话,该类会将上下文的连接字符串提供给上下文。

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

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

我想我的答案是,无论Entity Framework是否允许您执行此操作,您都可能不应该这样做。 使用工厂代替,并在不将对象上下文绑定到配置系统的情况下实现相同的灵活性:

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派生的类,而不是工厂,这是一个新概念。

(此答案仅确实适用于生产代码。无参数构造函数的技巧在概念验证之类的临时代码中很有用。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM