动态设置EF 6连接字符串

时间:2014-01-23 11:56:27

标签: c# entity-framework

我已经看过很多关于此的帖子,但我不明白如何实现这一点。

我的连接字符串在app.config中指定为“MealsContext”,我的EF数据模型容器名称是“MealsContext”,我如何使用MealsContext的实例但是定义要在运行时使用的连接字符串?如果我创建一个新的EntityConnection,它不知道模型中有哪些实体对象,例如这就是我目前正在做的......

    private MealsContext context = new MealsContext();

public void InsertOrUpdate(Meal _entity)
        {
            context.Entry(_entity).State = _entity.Id == default(int) ? EntityState.Added : EntityState.Modified;
            context.SaveChanges();
        }

2 个答案:

答案 0 :(得分:1)

以防万一其他人正在寻找这个,我从其他一些帖子中拼凑出答案,这些帖子说同样的事情,但我起初并没有得到它。我在app.config文件中添加了几个不同的命名连接字符串。然后我覆盖了实体模型中的上下文类,以便它将连接字符串的名称作为参数

public MealsContext(string connectionString) : base(connectionString) 

{

}

我传入的字符串是“name = csTest”,其中csTest是app.config中定义的连接字符串。然而,诀窍是在某处单独指定此上下文 - 例如在类库文件夹中,以便在更新或重建模型时不会自动覆盖上下文。

答案 1 :(得分:1)

EF 6的数据库上下文基类DbContext有两个重载 - 其中一个带有DbConnection和一个布尔标志,指示前面提到的DbConnection对象是否应该是在处理上下文时处理(IOW如果为真,则在处理上下文时处置DbConnection)。你也可以使用构造函数重载,只需要一个连接字符串,但我想举一个例子来说明如何在控制DbConnection对象的生命周期时这样做。

问题在于,当生成特定上下文时,默认情况下只有默认(公共/无参数)构造函数可用,如果查看生成的类,则使用基于配置文件的EF连接字符串条目。好处是你生成的继承自DbContext的上下文遵循使用partial修饰符生成上下文类的最佳实践,这允许您创建自己的特定模型上下文的partial实现。 / p>

我建议在项目中创建一个新的类文件(显式不是代码生成的文件),并且至少只需要一个具有{{partial的构造函数来实现模型的上下文类的DbConnection实现。 1}}和一个bool参数来镜像前面提到的DbContext构造函数签名。

例如,如果生成的上下文定义为:

public partial class MyModelContainer : DbContext...

然后你可以创建你的部分类实现(当然在你的闪亮,新的和单独的类文件中):

public partial class MyModelContainer
{
    public MyModelContainer(DbConnection dbConnection, bool contextOwnsConnection)
        : base(dbConnection, contextOwnsConnection)
    {
        // you can other stuff here if you need to, but don't have to for this example
    }
}

如果你已经做到这一点,你应该能够创建MyModelContainer个对象,其数据库连接与你提供的DbConnection对象使用的连接字符串一样动态。

示例:

public void DynamicConnectionExample(string entityConnectionString)
{
    DbConnection dbConnection = new EntityConnection(entityConnectionString);
    bool shouldImplicitlyDisposeOfConnection = true;
    using (var ctx = new MyModelContext(dbConnection, shouldImplicitlyDisposeOfConnection))
    {
        // do stuff...
    }
 }
显然,你可以通过各种方法来配置DbConnection对象的连接字符串,我建议您尝试这样做的方式,而不是示例中显示的方式。

另外值得注意的是:根据您使用的是模型优先还是代码优先,这会对您将要使用的DbConnection的特殊类型产生影响。例如,如果您使用的是EF模型,则会使用EntityConnection对象,因为您需要访问程序集中的元数据编译资源。

参考:http://msdn.microsoft.com/en-us/library/gg696604(v=vs.113).aspx