DbContext动态映射表

本文关键字:映射 动态 DbContext | 更新日期: 2023-09-27 18:10:04

如果我有一个dbContext,它的连接字符串是在创建上下文期间创建的,然后我想根据该信息中的一些映射表名....如何将数据传递给表映射?例如:

private object createContext(string name, string country)
{
    DbConnectionstringbuilder conn = new DbConnectionstringbuilder();
    conn.Add("Provider", "System.Data.SqlClient");
    conn.ConnectionString = string.Format(name, "dbName_" + country + "_moreName");   
    //maybe an if/else since we will say there are more names and countries
    return new object(conn.ToString());
}

现在,当您初始化dbcontext时,它是这样的:

public class object : DbContext
{
    public object(string conn):base(conn)
    {
        DbDatabase.SetInitializer<object>(null);
    }
//insert dbset and mapping config calls here
}

现在我想让我的表映射到像"table_" + country + "_endtablename";我该如何把数据传递给映射调用呢?

这些表被映射到使用这种格式的现有数据库。国家实际上来自登录用户的凭据,因此基于位置等。我只需要找到一种方法来访问该国家代码,该代码是后者创建的dbcontext中基类的内部构造函数。

DbContext动态映射表

嗯…我会在DbContext类上创建一个工厂方法,然后为您希望支持的每个国家实现派生的DbContext类。这将使您能够为每个国家/地区定制数据库初始化器。由于所有派生的、具体的dbcontext都使用相同的抽象父类,因此您可以将它们强制转换为父类并使用它们。在初始化器中,可以使用流畅映射来设置数据库名称并映射所需的表名称。EF Code First的美妙之处在于,它允许你使用标准的OO模式(比如工厂方法)来解决你所描述的问题。

但是,我不得不说,您可能需要重新考虑您的表命名方案。您发现这很难的原因是因为它是一个有点不寻常的设置。终端用户通常不会直接对数据库中的表进行查询,因为执行业务规则太难了。除非由于技术原因,您需要每个数据库中的表具有国家编码的名称,否则我会让技术驱动您的表命名方案,让您的客户驱动最终用户体验。我认为国家编码的数据库名称就足够了。这实现了数据分离,但使编码更简单,并且使为一个数据库编写的查询可以在其他数据库上工作。