动态DbContext映射表
问题描述:
如果我有一个dbContext谁的连接字符串是在上下文创建过程中创建的,然后我想根据一些信息来映射表名......如何将该数据传递给表映射?例如:动态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_” +国+ “_endtablename”;我猜如何将数据传递给映射调用?
这些表映射到使用此格式的现有数据库。该国实际上来自登录用户的凭据,因此基于位置等。我只需要找到一种方法来访问该国家代码,该代码是后者创建的dbcontext中的基类的内部构造函数。
答
嗯......我会在你的DbContext类上做一个工厂方法,然后为你希望支持的每个国家实现派生的DbContext类。这将使您能够为每个国家/地区自定义数据库初始值设定项。由于所有派生的具体DbContext使用相同的抽象父对象,因此可以将它们作为父对象并使用它们。在初始化程序中,您可以使用流畅的映射来设置数据库名称并映射所需的表名。 EF Code First的优点在于,它允许您使用标准的OO模式(如工厂方法)来解决您所描述的问题。
但是,我不得不说,你可能想重新考虑你的表命名方案。你发现这很难的原因是因为它有点不寻常的设置。最终用户通常不会直接针对数据库中的表进行查询,因为执行业务规则太困难了。除非有技术原因,否则您需要每个数据库中的表具有国家/地区代码的名称,否则我会让技术推动您的表格命名方案,并让您的客户推动最终用户体验。我认为国家编码的数据库名称是足够的。这实现了数据分离,但使得编码变得更加简单,并且使得为一个数据库编写的查询在其他数据库上工作。
马克感谢您的回应。我将考虑工厂方法,但是这又必须根据用户访问数据来切换。国家代码基本上来自其凭据。话虽如此,数据库已经存在,因此我不得不将它们映射为数据库已经结构化......长话短说,尽管我同意命名,但它的目的也是这样。 – MKunstman