c# - 如何防止 Entity Framework 代码优先使用不属于模型的派生类

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

这是我正在做的事情、正在发生的事情以及应该发生的事情的一般示例:

首先,我声明我的代码优先模型,如下所示:

上下文:

namespace Models {
    public class MyContext : DbContext
    {
        public DbSet<ClassA> ClassA { get; set; }
        public DbSet<ClassB> ClassB { get; set; }

        public MyContext()
            : base("name=MyContext")
        {
        }
    }
}

A 类和 B 类:

namespace Models {
    public class ClassA
    {
        public int ClassAID { get; set; }
        public string BaseAVal { get; set; }
        public virtual ICollection<ClassB> ClassBChildren {get; set; }//Relation Property
    }
    public class ClassB
    {
        public int ClassBID { get; set; }
        public int ClassAID { get; set; }//Foreign Key
        public string BaseBVal { get; set; }
        public virtual ClassA ClassAParent { get; set; }//Relation Property
    }
}

现在在其他地方,在另一个命名空间中,我有派生自模型类的用于不同目的的类。

派生类:

namespace CalculatedModels {
    public class DerivedClassA : ClassA
    {
        string SecondAVal { get; set; }
        public static DerivedClassA fromDBItem(ClassA dbItem) {
            //Create a DerivedClassA
            //Copy over inherited properties from dbItem (via Reflection)
            //Calculate its non-inherited properties
            //return it
        }
        public ClassA toDBItem() {
            //Create a ClassA
            //Copy over inherited properties from this (via Reflection)
            //return it
        }
    }
    public class DerivedClassB : ClassB
    {
        string SecondBVal { get; set; }
        //Conversion functions similar to those in DerivedClassA go here...
    }
}

当我让 EntityFramework 从这个模型生成数据库时,问题就出现了。我不希望它包含派生类中的任何内容。它们不是数据库要关心的!为什么我还要将它们放在一个完全不同的命名空间中,并使上下文中的集合成为非扩展基类型?表格应该如下所示:

Table: ClassA
    ---Columns---
    ClassAID (PrimaryKey, int, not null)
    BaseAVal (nvarchar(max), null)

Table: ClassB
    ---Columns---
    ClassBID (PrimaryKey, int, not null)
    ClassAID (ForeignKey, int, not null)
    BaseBVal (nvarchar(max), null)

但 EF 坚持通过添加派生类的新声明属性来破坏我的预期模式,如下所示:

Table: ClassA
    ---Columns---
    ClassAID (PrimaryKey, int, not null)
    BaseAVal (nvarchar(max), null)
    SecondAVal (nvarchar(max), null) --This should NOT be here!!
    Discriminator (nvarchar(128)) --Neither should this!!

Table: ClassB
    ---Columns---
    ClassBID (PrimaryKey, int, not null)
    ClassAID (ForeignKey, int, not null)
    BaseBVal (nvarchar(max), null)
    SecondBVal (nvarchar(max), null) --This should NOT be here!!
    Discriminator (nvarchar(128)) --Neither should this!!

如您所见,它包括派生类作为模型和/或数据库系统的可能部分,尽管模型中的任何内容都与它们无关。他们引用模型中的东西,而不是相反——永远。我不想让它使用它们!我如何防止它这样做?

最佳答案

Entity Framework 正在做它应该做的事情,因为您的设置遵循每层次结构表 (TPH) 继承模式。

Discriminator 被添加,以便数据库可以区分何时将 ClassA 或 DervivedClassA 添加到 DB

您可以使用 NotMapped 属性停止 EF 映射派生类。 添加以下命名空间

using System.ComponentModel.DataAnnotations.Schema;

派生类B

[NotMapped]
public class DerivedClassB : ClassB
{
    string SecondBVal { get; set; }
    //Conversion functions similar to those in DerivedClassA go here...
}

关于c# - 如何防止 Entity Framework 代码优先使用不属于模型的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28976994/

相关文章:

c# - 是否可以通过编程方式启用/禁用硬件?

entity-framework - 必须为 Entity Framework 中的所有关键属性指定映射?

c# - 如何动态插入/编辑中继器的值?

c# - 非托管资源、IDisposable 和自定义类型

c# - Razor ASP.NET : Show data from 'if' inside 'foreach' . 'break;' 不工作

c# - Entity Framework 通过在没有选择的情况下将当前值增加一来更新一列

c# - LINQ 表达式失败,但 foreach 循环有效 Entity-Framework

c# - 我可以对以任何顺序唯一的多个属性设置主键/唯一约束吗?

linq - ef cf linq 填充被忽略的属性

c# - EF 代码首先批量插入