动态映射表的DbContext

时间:2011-09-30 15:03:22

标签: c# entity-framework ef-code-first 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_”+ country +“_endtablename”;我想如何将数据传递给映射调用?

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

1 个答案:

答案 0 :(得分:0)

嗯...我会在你的DbContext类上创建一个工厂方法,然后为你想要支持的每个国家实现派生的DbContext类。这将使您能够为每个国家/地区自定义数据库初始化程序。由于所有派生的,具体的DbContexts都使用相同的抽象父级,因此您可以将它们作为父级转换并使用它们。在初始化程序中,您可以使用fluent映射来设置数据库名称并映射所需的表名称。 EF Code First的优点在于它允许您使用标准的OO模式(如工厂方法)来解决您描述的问题。

但是,我不得不说,您可能想重新考虑一下您的表命名方案。你发现这个问题的原因是因为这是一个有点不同寻常的设置。最终用户通常不会直接针对数据库中的表进行查询,因为执行业务规则太难了。除非有技术原因要求每个数据库中的表都有国家编码的名称,否则我会让这项技术推动您的表格命名方案,让您的客户推动最终用户体验。我认为国家编码的数据库名称是足够的。这实现了数据分离,但使编码更加简单,并且使为一个数据库编写的查询能够在其他数据库上运行。