【问题标题】:DbContext mapping tables dynamicallyDbContext 动态映射表
【发布时间】:2011-11-28 13:35:42
【问题描述】:

如果我有一个 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 中基类的内部构造函数。

【问题讨论】:

    标签: c# entity-framework ef-code-first dbcontext


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我将研究工厂方法,但这必须根据用户访问数据的方式进行切换。国家代码本质上来自他们的凭据。话虽这么说,数据库是预先存在的,因此我不得不将它们映射,因为数据库已经被构造成……长话短说,虽然我同意命名,但它也是有目的的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多