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