如何防止 Entity Framework Code First 使用不属于模型的派生 类
How to Keep Entity Framework Code First from using Derived Classes that Aren't Part of the Model
这是我正在做的事情、正在发生的事情以及应该发生的事情的一般示例:
首先,我声明我的代码优先模型,如下所示:
上下文:
namespace Models {
public class MyContext : DbContext
{
public DbSet<ClassA> ClassA { get; set; }
public DbSet<ClassB> ClassB { get; set; }
public MyContext()
: base("name=MyContext")
{
}
}
}
类甲乙:
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!!
如您所见,它包括派生的 类 作为模型 and/or 数据库系统的可能部分,尽管模型中的任何内容都与它们无关。他们引用模型中的东西,而不是相反——永远。我不想让它使用它们!我如何防止它这样做?
Entity framework 正在做它应该做的事情,因为您的设置遵循 Table-Per-Hierarchy (TPH) 继承模式。
添加鉴别器以便数据库可以区分何时向数据库添加了ClassA或DervivedClassA
您可以使用 NotMapped 属性停止 EF 映射您的 Derived 类。
添加以下命名空间
using System.ComponentModel.DataAnnotations.Schema;
DerivedClassB
[NotMapped]
public class DerivedClassB : ClassB
{
string SecondBVal { get; set; }
//Conversion functions similar to those in DerivedClassA go here...
}
这是我正在做的事情、正在发生的事情以及应该发生的事情的一般示例:
首先,我声明我的代码优先模型,如下所示:
上下文:
namespace Models {
public class MyContext : DbContext
{
public DbSet<ClassA> ClassA { get; set; }
public DbSet<ClassB> ClassB { get; set; }
public MyContext()
: base("name=MyContext")
{
}
}
}
类甲乙:
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!!
如您所见,它包括派生的 类 作为模型 and/or 数据库系统的可能部分,尽管模型中的任何内容都与它们无关。他们引用模型中的东西,而不是相反——永远。我不想让它使用它们!我如何防止它这样做?
Entity framework 正在做它应该做的事情,因为您的设置遵循 Table-Per-Hierarchy (TPH) 继承模式。
添加鉴别器以便数据库可以区分何时向数据库添加了ClassA或DervivedClassA
您可以使用 NotMapped 属性停止 EF 映射您的 Derived 类。 添加以下命名空间
using System.ComponentModel.DataAnnotations.Schema;
DerivedClassB
[NotMapped]
public class DerivedClassB : ClassB
{
string SecondBVal { get; set; }
//Conversion functions similar to those in DerivedClassA go here...
}