如果我有一个 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
}
现在我希望我的表映射到 like "table_"+ country + "_endtablename";我猜想如何将数据传递给映射调用?
这些表映射到使用此格式的现有数据库。该国家/地区实际上来自登录用户的凭据,因此基于位置等。我只需要找到一种方法来访问该国家/地区代码,该代码是后者创建的 dbcontext 中基类的内部构造函数。
最佳答案
嗯……我会在您的 DbContext 类上创建一个工厂方法,然后为您希望支持的每个国家/地区实现派生的 DbContext 类。这将使您能够为每个国家/地区自定义数据库初始化程序。由于所有派生的具体 DbContext 使用相同的抽象父级,因此您可以将它们转换为父级并使用它们。在初始化程序中,您可以使用流畅的映射来设置数据库名称并映射您需要的表名。 EF Code First 的美妙之处在于它允许您使用标准的 OO 模式(如工厂方法)来解决您所描述的问题。
但是,我不得不说,您可能需要重新考虑您的表命名方案。您发现这很难的原因是因为它是一个有点不寻常的设置。最终用户通常不会直接对数据库中的表进行查询,因为执行业务规则太难了。除非有技术原因要求每个数据库中的表具有国家代码名称,否则我会让技术驱动您的表命名方案并让您的客户驱动最终用户体验。我认为国家编码的数据库名称就足够了。这实现了数据分离,但使编码更简单,并且使为一个数据库编写的查询适用于其他数据库。
关于c# - DbContext 动态映射表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612340/