在运行时更改实体框架上下文

时间:2014-06-10 20:18:57

标签: asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

在解决方案中,我有两个DAL。每个访问不同的服务器。

第一个服务器/数据库包含一个将提供数据库名称的表。

var db = "db_1"; // can be db_1, db_2, db_3, etc.

第二台服务器包含许多数据库 - 每个数据库都包含需要查询的相同表。

我需要能够根据db值动态切换上下文。我希望能够将db var传递给返回/使用正确Context的业务层。

1 个答案:

答案 0 :(得分:0)

您可以为此创建两个模型。一个用于您的数据库,其中包含提供数据库名称的表,另一个用于其他数据库。

如果使用db first方法,则将使用默认连接字符串创建上下文对象。由于它是一个部分类,你可以扩展它以获取类似的连接字符串......

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

这是在运行时,您将传递从第一个上下文中提取的服务器/数据库的连接字符串。像这样的东西就是它的样子......

...
using(var dbNameContext = new DatabaseNameContext())
{
    var dbName = dbNameContext.DBNames.FirstOrDefault(dbn => dbn.Name == "db1");
    var connectionString = "metadata=res://*/Database..." + dbName.Name;
    using(var dbContexts = new MyContext(connectionString))
    {
        var MyDataList = dbContexts.Data.ToList();
    }
}

显然,您应该将连接字符串修复为您自己的连接字符串,并将dbName放在连接字符串中。

您应该确保您的计划完好无损,以保持不同数据库中的所有不同表格相同,以便模型准确无误。否则你将获得RTE。