我有一对夫妇与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
表重复插入错误(这是一个查找表)..
然而,如果我移动的属性,AnimeDIrection
和AnimeDirectionEnum
到子类,TextListItemElement
,操作成功没有错误......我有3个其他子类也共享属性(实际上有两个我分享的基类的查找属性,所以不建议将属性移动到子类)...
这是EF 4.2中的一个错误,或者可能是由于我的基类是抽象的(微软有基础抽象类的不良历史....)
对不起,我重新编辑了删除第二个问题的消息。不知道为什么它没有被删除...(我克服了编辑,并删除了第二个问题,然后重新张贴<我认为) – 2012-01-17 20:32:20
感谢您的答案。可能是EF核心如何确定DB映射的限制。我收到的错误相当具有误导性(表明Id未映射或被忽略,但实际上它是我的其他属性,它不是未映射的)。 我不喜欢用数据特有的或演示特定的知识(通过表示我参考MVC验证属性)来监视我的业务实体(请参阅数据传输对象设计模式)。关于如果用于序列化(xml和二进制支持),我允许或容纳的唯一属性。 感谢您的时间和耐心 – 2012-01-17 20:49:33