实体框架6,数据库优先,多个模式一个模型

时间:2016-05-31 17:15:48

标签: sql-server database entity-framework asp.net-mvc-4 c#-4.0

我已经使用多个模式定义了一个数据库,每个模式都有完全相同的表和关系(我们需要根据要加载的项目来分离数据库)。 我使用EF6向导和DB(DB First)中的EF Designer选项,选择连接后,我可以选择表格,视图等:

DB Schemas

如果我在这里只选择一个包含其所有表的模式(即:P08590),那么该模型包含的实体将仅CRUD来自这种模式的表(显然)。 问题是我需要根据登录到一个项目来从不同的模式中获取CRUD数据。 在阅读和谷歌搜索后,我发现你可以告诉一个类通过它引用的表和模式的属性:

[Table("P08590.ACTIVITIES")]
public partial class ACTIVITy
{
    ...
}

所以我提出了在登录应用程序后存储某种全局变量的想法:

[Table("ACTIVITIES", Schema = globalVariable)]
public partial class ACTIVITy
{
    ...
}

但是将变量传递给属性是不可行的。是否有任何可能的方法来实现这种行为?

2 个答案:

答案 0 :(得分:0)

如果您不想使用数据注释,可以使用流畅的API ...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<ActivityClass1>().ToTable("Activities", schemaVariable);
}

答案 1 :(得分:0)

codeplex上的此适配器将帮助您实现此目标。

毫无疑问,您必须稍微调整一下代码

要使用此适配器,您必须将上下文类转换为部分类,并从AdaptingObjectContext继承它,如

public partial class MyObjectContext : BrandonHaynes.ModelAdapter.EntityFramework.AdaptingObjectContext
{
        public MyObjectContext() 
        : base(myConnectionString, 
            new ConnectionAdapter(
                new TableSchemaModelAdapter("myschema"), 
            System.Reflection.Assembly.GetCallingAssembly()))
        {
        ...
        }
}

有关详情,请点击此blog

修改

由于DbContext取代了ObjectContext(DbContext作为ObjectContext的包装器),我们仍然可以使用此解决方案构造DbContext并使用该组件的所有功能。您只需以为此工具定义的方式构造对象,然后使用Repository(或其他位置)中的ObjectContext创建DbContext。

要实现这一点,您可以按照MSDNStackOverflow上的好回复