2012-05-10 26 views
2

我見過很多EF POCO示例,其中每個POCO類都繼承了一個基本實體類或實現了一個IEntity接口。爲什麼在EF庫模式下使用POCO的Base類?

我很明白爲什麼會這樣使用,但我看不出它會在所有情況下都能正常工作,除非我錯過了某些東西。

實體基類可能是這樣的:

public class Entity 
{ 
    #region Primitive Properties 
    [Key] 
    public int Id { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
    [Timestamp] 
    public byte[] rowversion { get; set; } 
    #endregion 
} 

...和混凝土POCO類是這樣的:

public class BlogCategory : Entity 
{ 
    #region Properties 

    [Required(ErrorMessage = "Category Name is required.")] 
    public string CategoryName { get; set; } 
    public virtual ICollection<Blog> BlogList { get; set; } 

    #endregion 
} 

這是罰款時,我所有的類都包含一個單一的主鍵屬性,但是當我有多對多關係時會發生什麼?通常在多對多關係中,實體具有代表該實體主鍵的雙重屬性。

如:

public class ClaimQuestionAnswer : Entity <-- this will not work, will it? 
{ 
    [Key] 
    public int QuestionId { get; set; } 
    [Key] 
    public int AnswerId { get; set; } 
    public string Answer { get; set; } 
    public byte[] rowversion { get; set; } 
} 

將這個特殊的POCO不能繼承的基類?

任何澄清表示讚賞。

謝謝。

+0

在你的例子中,我會做一個組合的唯一約束和一個單獨的PK,而不是一個組合的PK。 – Maess

+0

@Maess:從數據庫的角度來看,這很好,但只要EF不支持唯一性約束,我不會這麼做。 EF不知道任何關於唯一約束的信息,您必須手動確保唯一性。這將是一個解決方案,只爲所有實體保留一個具有單個鍵基類的體系結構,但如果您在模型中自然具有組合鍵,則體系結構首先是錯誤的。 – Slauma

+0

@Slauma,你是說在一個「連接」實體的情況下,它應該有一個Id主鍵,然後是兩個外鍵?目前似乎還沒有達成共識。 – Kahanu

回答

1

你可能只看到了一些沒有使用任何帶有組合鍵的實體類的例子。否則,他們有你現在面臨的同樣的問題。

多對多關係不是最好的例子,因爲在一個真正的多對多關係中,連接表在模型中沒有相應的實體。但是,您可能有任何其他原因在實體中的組合鍵,或者您可能有其實體的鍵只需要有另一種類型(string,long,Guid或其他)。

在這種情況下,您不能使用您的基類,因爲該鍵不再是所有實體的公共屬性。您可以將密鑰移出基類,並將其放入不同的派生類中 - 只有DateCreated,DateModifiedrowversion是常用屬性。或者您可以爲您正在使用的不同鍵類型創建多個基類。

這一切都取決於您希望在所有實體中支持哪些常用屬性。

+0

感謝您的解釋,這是我的預期,但我不知道我錯過了什麼。多基類場景是我必須考慮的一種想法。謝謝。 – Kahanu