如果我有一个在上下文创建期间创建的连接字符串的dbContext,然后我想根据其中的一些information....how映射表名,我会将该数据传递给表映射吗?例如:
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中基类的内部构造函数。
发布于 2011-10-01 03:00:05
好吧..。我会在您的DbContext类上创建一个工厂方法,然后为您希望支持的每个国家实现派生的DbContext类。这将使您能够自定义每个国家/地区的数据库初始化器。由于所有派生的、具体的DbContexts都使用相同的抽象父级,因此您可以将它们转换为父级并使用它们。在初始化器中,您可以使用fluent映射来设置数据库名称并映射所需的表名。EF Code First的美妙之处在于,它允许您使用标准的OO模式(如工厂方法)来解决您所描述的问题。
但是,我不得不说,您可能需要重新考虑您的表命名方案。您发现这很困难的原因是因为这是一个有点不寻常的设置。最终用户通常不会直接对数据库中的表进行查询,因为执行业务规则太难了。除非有技术原因,您要求每个数据库中的表具有国家编码名称,否则我会让技术驱动您的表命名方案,并让您的客户驱动最终用户体验。我认为国家编码的数据库名称就足够了。这实现了数据分离,但使编码变得更简单,并使为一个数据库编写的查询在另一个数据库上工作。
https://stackoverflow.com/questions/7612340
复制相似问题