我有一對夫婦與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