2011-02-24 43 views
5

我很好奇爲什麼使用好友類進行數據驗證。考慮以下示例,其中MyEntity是Linq-to-SQL或Linq-to-Entities實體,下面的類是增強實體的部分類。爲什麼好友類用於驗證?

[MetadataType(typeof(MyEntity.MyEntityMetadata))] 
public partial class MyEntity 
{ 
    private class MyEntityMetadata 
    { 
     [Required(ErrorMessage = "The title is required.")] 
     public string Title { get; set; } 
    } 
} 

爲什麼設計如此呢?當他們設計DataAnnotations時,爲什麼選擇這個「夥伴模式」?爲什麼不直接在實體中放置屬性?

+2

我的理解是它可以讓你擴展設計師的特色。你不願意調整元屬性,只是爲了讓你的下一個設計師更新所有元素。 – 2011-02-24 20:05:11

+0

單一責任本金? – 2011-02-24 20:05:23

回答

4

原因很實際 - 在linq-to-sql和linq-to-entities中,代表每次更新對象模型時重新生成的類的代碼。爲了避免註釋在這種情況下被覆蓋,他們需要在單獨的「夥伴」類中。

如果您在不同的上下文中使用數據註釋 - 比如視圖模型 - 那麼他們可以繼續使用原始類。

+0

我不知道這些屬性可以直接放在數據類上,比如直接在View Model中。答案標記爲額外的細節。謝謝。 – kbrimington 2011-02-24 21:06:30

+0

「夥伴模式」 - 不是「模式」,只是爲了避免髒兮兮的。從來沒有MS團隊的偉大設計。 – hB0 2015-02-12 14:54:17

5

我認爲這可以防止生成的實體覆蓋自定義元數據信息。

+4

我認爲你是對的。不過,這真是一個醜陋的黑客! – 2011-02-24 20:10:55

+0

+1:謝謝你的提示,並且正確,回覆。 – kbrimington 2011-02-24 21:05:11