是否可以动态更改Entity Framework模型中的基础数据库源?

时间:2018-03-01 23:22:18

标签: c# entity-framework

在我的应用程序中,我已经从现有数据库生成了EF模型。我的问题是,在我们的环境中,每个月都有一个单独的数据库,包含相同的表和结构。(例如Database_012018,Database_022018 ...等)。 是否可以使用相同的EF模型使用某个参数查询不同的月度底层数据库?

希望有一个解决方案,因为我刚接触EF,我不知道是否可以实现。感谢。

编辑:这是一个Windows窗体应用程序和EF 6。

This is my context class code which is generated automatically :

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
}

1 个答案:

答案 0 :(得分:1)

正如@ChetanRanpariya建议的那样,假设如下:

  • 使用EF 6与模型优先方法(edmx)
  • 您希望每次都查询单个数据库

每次查询initial catalog时,您都可以使用不同的DbContext传递连接字符串,例如:

string database = "Database_012018";

var cnnString = $"metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=\"data source=.;initial catalog={database};integrated security=True\"";

using (var ctx = new BlogsEntities(cnnString))
{
    ctx.Blogs.Where(...);
}

如果您使用自动生成的DbContext(在我的情况下为BlogsEntities),您可能需要添加一个接受连接字符串的构造函数。您可以在另一个.cs文件中执行此操作,作为分部类,以避免触及自动生成的文件:

public partial class BlogsEntities : DbContext
{
    public BlogsEntities(string cnnString)
        : base(cnnString)
    {

    }
}

更新

请注意,您的连接字符串必须包含元数据EDMX引用(在我的示例中,edmx文件称为Model.edmx)。只需从配置中借用当前的连接字符串,然后更改initial catalog值。