【问题标题】:Entity Framework 6, DB first, Multiple Schemas One Model实体框架 6,DB 优先,多模式一个模型
【发布时间】:2019-01-25 23:28:45
【问题描述】:

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

DB Schemas

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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 并使用该组件的所有特性。您只需要以为此工具定义的方式构造对象,然后使用存储库中的 ObjectContext(或在其他地方)创建 DbContext。

    要实现这一点,您可以关注MSDNStackOverflow 上的精彩回复

    【讨论】:

    • 非常感谢 Ashish,这正是我一直在寻找的东西......遗憾的是,我不得不告诉你,由于该项目似乎已被放弃,它无法正常工作,最新更新早在 2010 年。作为结果,它只支持(现在被认为过时的)ObjectContext 而不是 DbContext。关于如何适应它的任何线索?
    • 其实在源代码的讨论页面中也有完全相同的问题,但我不明白它是如何解决的:Entity Framework Runtime Model Adapter
    • @JurgenHarms 抱歉回复晚了,他实际上是在谈论这个msdn.microsoft.com/en-us/library/gg696505(v=vs.103).aspxstackoverflow.com/a/11032822
    • @JurgenHarms As DbContext 是带有一些智能方法的 ObjContext 的轻量级包装器。您始终可以从 objContext 创建 dbcontext,反之亦然..
    • 感谢您回复@Ashish!我试图将 ObjectContext 传递给 DBContext 构造函数,但它不起作用,因为在 EF6 中他们已经更改了命名空间,现在它需要一个 System.Data.Entity.Core.Objects.ObjectContext 但从 DLL 我有一个 System.Data。对象.ObjectContext。我尝试将源代码重新编译为 .Net framework 4.5(它是为 .NET 3.5 编译的),但也不起作用。
    【解决方案2】:

    如果不想使用数据注解,可以使用fluent API...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2013-06-01
      • 2020-04-10
      • 2016-06-03
      相关资源
      最近更新 更多