1

我有一对夫妇与EF 4.2与代码优先的设计方法和基类继承财产(表每个具体类型)流利的API问题...几个问题与EF 4.2和继承类的关联属性

1)Fluent Api忽略基类属性(非原始属性)会导致EF错误。

看来我的流利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; } 
} 

... 

} 

用流利的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生成错误 'ID' 未在类ChapterElement发现...

但是,如果我添加数据注释[NotMapped]在BaseContentElement类的Parent属性中,EF引擎为appy并且创建了数据库...

2)将基类关联属性设置为厕所KUP表会导致错误的重复键插入...

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( ...对于查找表中的每个项目...)。

当我添加实体到DB我上AnimationDirection表重复插入错误(这是一个查找表)..

然而,如果我移动的属性,AnimeDIrectionAnimeDirectionEnum到子类,TextListItemElement,操作成功没有错误......我有3个其他子类也共享属性(实际上有两个我分享的基类的查找属性,所以不建议将属性移动到子类)...

这是EF 4.2中的一个错误,或者可能是由于我的基类是抽象的(微软有基础抽象类的不良历史....)

回答

0

这两个问题是完全无关的,所以不应该一起提问。应该单独询问第二个问题,并附上代码示例,说明如何附加/添加实体,因为问题的重要部分已经丢失,而且描述确实没有说清楚 - 真正可重现的代码确实如此。

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

+0

对不起,我重新编辑了删除第二个问题的消息。不知道为什么它没有被删除...(我克服了编辑,并删除了第二个问题,然后重新张贴<我认为) – 2012-01-17 20:32:20

+0

感谢您的答案。可能是EF核心如何确定DB映射的限制。我收到的错误相当具有误导性(表明Id未映射或被忽略,但实际上它是我的其他属性,它不是未映射的)。 我不喜欢用数据特有的或演示特定的知识(通过表示我参考MVC验证属性)来监视我的业务实体(请参阅数据传输对象设计模式)。关于如果用于序列化(xml和二进制支持),我允许或容纳的唯一属性。 感谢您的时间和耐心 – 2012-01-17 20:49:33