2013-07-15 48 views
0

我試圖運行此代碼時出現錯誤。
EF 5代碼第一次在類中使用繼承

無法確定 類型「AddressBook.DAL.Models.User」和「AddressBook.DAL.Models.User」之間的關聯的主要端。 必須使用關係流暢API或數據註釋,明確配置此關聯的主要目的地 。

目標是我創建了所有表的commonfield的baseClass。

如果我不使用基類一切工作正常。

namespace AddressBook.DAL.Models 
{ 
public class BaseTable 
{ 
    [Required] 
    public DateTime DateCreated { get; set; } 
    [Required] 
    public DateTime DateLastUpdatedOn { get; set; } 

    [Required] 
    public virtual int CreatedByUserId { get; set; } 

    [ForeignKey("CreatedByUserId")] 
    public virtual User CreatedByUser { get; set; } 

    [Required] 
    public virtual int UpdatedByUserId { get; set; } 

    [ForeignKey("UpdatedByUserId")] 
    public virtual User UpdatedByUser { get; set; } 

    [Required] 
    public RowStatus RowStatus { get; set; } 

} 

public enum RowStatus 
{ 
    NewlyCreated, 
    Modified, 
    Deleted 
} 


} 




namespace AddressBook.DAL.Models 
{ 
public class User : BaseTable 
{ 
    [Key] 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
    public string Password { get; set; } 

} 

} 
+0

我已經在EF4中完成了這一點,並且與您的代碼唯一的區別是我沒有將int關鍵字放在int關鍵字屬性上。也許試着用'public int CreatedByUserId {get; set;}'和'public int UpdatedByUserId {get; set;}'?? –

+0

我不知道我是否唯一,但我不明白你的錯誤。 'AddressBook.DAL.Models.User和AddressBook.DAL.Models.User'(Same Models?)。另外,你提到了使用'Inheritence',但是在代碼中沒有這樣的標記。 – Komengem

+0

@Komenge Mwandila從用戶到用戶有一個'1..1'的關係,因爲用戶可以由其他用戶或他自己修改/創建。 此外,你可以看到,用戶繼承BaseTable'公共類用戶:BaseTable {...' –

回答

0

您需要向EF提供映射信息。以下文章介紹了不同EF實體繼承模型(table-per-type,table-per-hierarchy等)的代碼優先策略。並不是所有的場景都是你在這裏直接做的,但要注意映射代碼,因爲這是你需要考慮的(如果你想在其他場景中使用繼承,這是很好的信息)。請注意,對於ORM來說,繼承具有限制和成本,特別是對於多態關聯(這使得TPC方案難以管理)。 http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

EF可以處理這種情況的另一種方式是將複雜類型聚合爲「假」組成關係。換句話說,即使您的審計字段是某個事務性實體表的一部分,您也可以將它們分成一個常見的複合類型,該類型可以與包含這些相同字段的任何其他實體相關聯。這裏的區別是你實際上將這些字段封裝成另一種類型。因此,舉例來說,如果你動了你的審計字段爲「審覈」 complext類型,你會是這樣的: User.Audit.DateCreated的 代替 User.DateCreated

在任何情況下,你仍然需要提供適當的映射信息。 這篇文章解釋瞭如何做到這一點:http://weblogs.asp.net/manavi/archive/2010/12/11/entity-association-mapping-with-code-first-part-1-one-to-one-associations.aspx

+0

他使用DataAnnotation來表示映射關係信息。您可以在定義FK的'BaseTable'類中看到它:'[ForeignKey(「CreatedByUserId」)]'。 –