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 表(这是一个查找表)上出现重复插入错误..

但是,如果我将属性 AnimeDIrectionAnimeDirectionEnum 移动到子类 TextListItemElement,则操作成功且没有错误...我还有 3 个其他子类也共享属性(实际上在那里是我共享的基类上的两个查找属性,因此不建议将属性移至子类)...

这可能是 EF 4.2 中的错误,也可能是由于我的基类是抽象的(Microsoft 在基抽象类方面有着糟糕的历史......)

【问题讨论】:

【参考方案1】:

这两个问题完全不相关,所以不应该一起问。第二个问题应与显示如何附加/添加实体的代码示例一起单独提出,因为缺少问题的重要部分并且您的描述确实没有说清楚 - 真正的可重现代码可以。

回答第一个问题:不可能。一旦基类的任何部分被映射,您就不能在派生类中忽略它。派生类必须包含映射到基类中的所有属性。

【讨论】:

抱歉,我重新编辑了删除第二个问题的消息。不知道为什么它没有被删除......(我点击了编辑,并删除了第二个问题,然后重新发布 感谢您的回答。可能是 EF 核心如何确定数据库映射的限制。我收到的错误相当具有误导性(表明 Id 未映射或被忽略,但实际上它是我的另一个未映射的属性)。我不喜欢用特定于数据或特定于表示的知识(通过表示我指的是 MVC 验证属性)来污染我的业务实体(请参阅数据传输对象设计模式)。关于序列化(xml和二进制支持)我允许或适应的唯一属性。感谢您的时间和耐心

以上是关于EF 4.2 和继承的类关联属性的几个问题的主要内容,如果未能解决你的问题,请参考以下文章

教义 2 - 具有附加属性和继承的关联表

UML类图关系全面剖析

EF学习笔记:读取关联数据

将两个对象与继承和聚合相关联是不好的编程习惯吗?

UML中的类图关系

UML类图关系(泛化、继承、实现、依赖、关联、聚合、组合)