EF 4.2 和继承的类关联属性的几个问题
Posted
技术标签:
【中文标题】EF 4.2 和继承的类关联属性的几个问题【英文标题】:A couple of issues with EF 4.2 and inherited class association properties 【发布时间】:2012-01-14 01:56:40 【问题描述】:我对 EF 4.2 和使用 Code First 设计方法和基类属性继承(每个具体类型的表)的 fluent api 有几个问题...
1) Fluent Api 忽略基类属性(非原始属性)导致 EF 错误。
我的 fluent api 中的忽略语句似乎没有在我的基类属性上正确处理。
class BaseContentElement
public virtual BaseContentElemnt Parent get; set;
public int Id get;set;
...
class ChapterElement : BaseContentElement
public virtual CourseElement Course
get return base.Parent as CourseElement; set base.Parent = value;
...
在fluent api中,声明
var config = new EntityTypeConfiguration<ChapterElement>();
config.Map(m =>
m.MapInheritedProperties();
m.ToTable("Chapter", Schema);
);
config.HasKet( ch => ch.Id );
config.Ignore( ch => ch.Parent );
导致 EF 生成在类 ChapterElement
上找不到 'Id' 的错误...
但是,如果我在 BaseContentElement
类的 Parent 属性上添加数据注释 [NotMapped],则 EF 引擎适用并创建了数据库...
2) 查找表的基类关联属性导致重复键插入错误...
public abstract class BaseListItemElement : BaseContentElement, IComparable
public int Id get; set;
public int Index get; set;
public virtual StaticContentBlockElement Item get; set;
public virtual eAnimationDirection AnimeDirectionEnum
get
if (AnimeDirection != null)
return AnimeDirection.EnumValue;
return eAnimationDirection.None;
set
AnimeDirection = AnimationDirection.Lookup[value];
public virtual AnimationDirection AnimeDirection get; set;
...
public class TextListItem : BaseListItemElement
...
在我的应用程序中,我在所有查找表值的内存中保留了一个查找表(该应用程序使用枚举 eAnimationDirection
,并且使用 AnimeDirection
属性更新数据库)。在我将记录添加到DBContext
之前,我将查找值附加到上下文DbContext.AnimationDirections.Attach(
...对于查找表中的每个项目...)。
当我将实体添加到数据库时,AnimationDirection
表(这是一个查找表)上出现重复插入错误..
但是,如果我将属性 AnimeDIrection
和 AnimeDirectionEnum
移动到子类 TextListItemElement
,则操作成功且没有错误...我还有 3 个其他子类也共享属性(实际上在那里是我共享的基类上的两个查找属性,因此不建议将属性移至子类)...
这可能是 EF 4.2 中的错误,也可能是由于我的基类是抽象的(Microsoft 在基抽象类方面有着糟糕的历史......)
【问题讨论】:
【参考方案1】:这两个问题完全不相关,所以不应该一起问。第二个问题应与显示如何附加/添加实体的代码示例一起单独提出,因为缺少问题的重要部分并且您的描述确实没有说清楚 - 真正的可重现代码可以。
回答第一个问题:不可能。一旦基类的任何部分被映射,您就不能在派生类中忽略它。派生类必须包含映射到基类中的所有属性。
【讨论】:
抱歉,我重新编辑了删除第二个问题的消息。不知道为什么它没有被删除......(我点击了编辑,并删除了第二个问题,然后重新发布 感谢您的回答。可能是 EF 核心如何确定数据库映射的限制。我收到的错误相当具有误导性(表明 Id 未映射或被忽略,但实际上它是我的另一个未映射的属性)。我不喜欢用特定于数据或特定于表示的知识(通过表示我指的是 MVC 验证属性)来污染我的业务实体(请参阅数据传输对象设计模式)。关于序列化(xml和二进制支持)我允许或适应的唯一属性。感谢您的时间和耐心以上是关于EF 4.2 和继承的类关联属性的几个问题的主要内容,如果未能解决你的问题,请参考以下文章