2010-05-01 74 views
2

在ScottGu的博客就是一個例子如何使用MVC2自定義驗證與EF4: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx自定義驗證與MVC2和EF4

所以這裏的問題:

當VS2010設計器創建數據庫對象,根據示例,您必須向該類添加[MetadataType(typeof(Person_validation))] Annotation。

但是,當我更改設計器中的任何內容時,所有這些註釋都會丟失。

是否可以對edmx文件進行自我更改,還是有更好的方法將System.ComponentModel.DataAnnotations應用於生成的實體?

謝謝。

回答

6

你可以用鬆散的稱爲「夥伴類」的模式來做到這一點。基本上你要做的是用你的元數據創建一個單獨的類,並創建一個將生成的實體連接到你的好友類的分類。

舉一個簡單的例子,假設您有一個Person實體,並且您希望將FirstName屬性設置爲必需的。這是你的生成的文件之外做什麼:

[MedadataType(typeof(PersonMetadata))] 
partial class Person { } // the other part is generated by EF4 

public class PersonMetadata 
{ 
    // All attributes here will be merged into the generated class, 
    // thanks to the partial class above. Just apply attributes as usual. 

    [Required] 
    public string FirstName { get; set; } 
} 

你可以找到這種方法的here更多細節。而且ScottGu也會在你所鏈接的文章中談到它。看標題下的 「第5步:堅持到數據庫」;)

+0

謝謝您的回答,但問題是更多關於部分: [MedadataType(typeof運算(PersonMetadata))] 部分類Person {}//另一部分由EF4生成 帶註釋的好友類正在正常工作。但我的問題是:我有大約100個實體。如果我在Visual Studio中對設計器進行了小改動,代碼將被重新生成。所以引用該夥伴類的所有註釋 [MedadataType(typeof(....))]都沒有了。所以如果我只是添加一個屬性,我可以去添加100個類再次註釋。不是EF一代人的想法。 – csharpnoob 2010-05-03 07:42:09

+0

@csharpnoob - 聽起來好像您將「MetadataTypeAttribute」添加到部分類的錯誤部分。這個想法是,因爲EF生成部分類,所以你可以在不同的文件中*自己的*部分寫* * * *重新生成,應用MetaDataAttribute。我通常會把屬性應用到同一個文件中的部分類,然後我可以立即看到哪些類會受到更改的影響。 – 2010-05-03 10:01:46

+0

該死的。對我的錯!部分註釋,我錯過了那個小細節。無論如何,這個存在設置默認值。再次感謝。 – csharpnoob 2010-05-03 11:06:59