使用一个EDMX文件,使用与多个数据库相关的多个连接字符串

时间:2014-07-15 22:49:18

标签: c# entity-framework edmx

我有一个程序有一个.edmx文件,而app.config中有三个连接字符串。

.edmx表示的架构对于3个数据库是相同的:

  1. 生产
  2. 分段
  3. 开发
  4. 我想创建一个基本上这样做的方法(警告!伪代码传入)

    foreach(var connectionString in connectionStrings) {
        using (MyCustomDBEntities context = new MyCustomDBEntities(connectionString)) {
            // Do cool things, like insert new records, update records, etc...
        }
    }
    

    现在我的代码实际上就是这个,我没有看到另一个接受连接字符串的方法签名:

    foreach(var connectionString in connectionStrings) {
        using (MyCustomDBEntities context = new MyCustomDBEntities()) {
            // Do cool things, like insert new records, update records, etc...
        }
    }
    

    有没有办法让using块中的Entity Framework构造函数采用连接字符串?我现在正在使用EF 6.1,但我找不到办法。

    此外,如果有更好的方法可以使用Entity Framework执行此操作,我很乐意切换我的代码,尽管使用Entity Framework是 必须 。< / p>

    如果您需要更多代码,请告诉我,我会更新任何内容。

1 个答案:

答案 0 :(得分:5)

创建EDMX时,您可以设置上下文对象,假定它只是一个连接字符串的模型。这很容易更改,因此您可以拥有多个具有多个重复数据库的连接字符串。

当您的模型代码自动生成时,您最终会得到一个连接数据库上下文。这就是源文件中应该是这样的......

-- MyModel.edmx
    -- MyModel.Context.tt
        -- MyModel.Context.cs

如果您查看MyModel.Context.cs,您应该看到这个......

public partial class MyContext : DbContext
{
    public MyContext ()
        : base("name=MyConnectionString")
    {
    }

    ...
}

MyConnectionString对应于应用配置中的连接字符串。请注意,没有构造函数重载来使用您自己的连接字符串,但这没关系,因为我们可以利用partial class以及DBContext确实有一个带有连接字符串的重载这一事实。

只需在与MyContext相同的名称空间中创建另一个文件,并使用此代码作为指南......

public partial class MyContext : DbContext
{
        public MyContext (string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
        }

        ...
}

完成。现在,您可以将您的上下文用于任何连接字符串

using(var context = new MyContext(connectionstring1))
{
    ...
}

using(var context = new MyContext(connectionstring2))
{
    ...
}