2009-10-08 120 views
12

我想實現數據註釋到我的Linq到SQL對象。生成.dbml文件,我不知道如何在不觸及生成的源代碼的情況下向對象添加數據註釋。ASP.NET MVC,Linq到SQL數據註釋驗證

我試圖將數據註釋添加到對象的單獨部分類,但它不識別它,也沒有Intelli感。

回答

22

正如我在我對這個問題的原始答案中所說的,你應該使用一個接口。我後面發佈的答案(標記爲Accepted)表示使用一個類。這不太好。接口是由於以下原因,一個更好的選擇:

  • 如果名稱之間的LINQ類,並在你的界面名稱不匹配,編譯器就會爲你
  • 的接口將不被實例化,所以此保護類用戶意外instatntiating元數據類型
  • 如果使用ReSharper的(或類似的),該接口可以被自動地從LINQ類
  • 接口是比一個空類更簡潔萃取
  • 如果你對int進行編程而不是類(這是一個很好的做法),那麼你已經有一個接口,你可以用作你的元數據類型

對於一個叫做「用戶」的類,爲它創建一個接口「IUSER」),然後更新您的部分用戶類的定義如下:

[MetadataType(typeof(IUser))] 
public class User : IUser 

然後,在您IUSER接口,添加適當的數據註釋屬性的屬性:

[Required]  
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")] 
string Username { get; set; } 
+1

我真的很喜歡這種方法,除了我不能添加[綁定(排除=「ID」)]屬性的接口,所以我不得不把它放在類。這是有效的,但元數據現在在類和接口之間進行分割。 – palmsey 2010-02-09 21:50:36

+0

但是我應該怎麼做,如果我在模型中有一些額外的領域?例如,我有額外的'確認密碼'字段。如果我把這個字段放在接口中,編譯器不會將這個字段傳遞出去,因爲Linq到SQL類中沒有這樣的字段。 – kseen 2011-11-24 10:41:58

+0

但是,如何自動生成這些屬性? dbml擁有生成它們所需的一切。我有20個表格,每列有數十列...我不會試圖手動保持這一點。任何人都有解決方案? – 2012-08-11 19:11:57

9

對於被叫,說「用戶」類,如下所示創建一個接口爲它(說「IUSER」),然後更新您的部分用戶類的定義:

[MetadataType(typeof(IUser))] 
public class User : IUser 

然後,在你IUSER接口,添加適當的數據註釋屬性的屬性:

[Required]  
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")] 
string Username { get; set; } 
6

LINQ到SQL生成對象類作爲部分。實現數據註釋的簡單方法是創建您自己的部分對象類,將[MetadataType(typeof(YourDataAnnotationClass))]放置在您創建的部分類上。

例子:

// Linq to SQL Class 
public partial class Article 
{ 
    public string Title { get; set; } 
    ...... etc 
} 

創建元數據你自己的元數據類要驗證

public class MyMetaDataClass 
{ 
    [Required] 
    [Range(5,20)] 
    public string Title { get; set; } 
} 

創建要添加元數據的Object類的分部類的每個領域,本例文章分類:

[MetadataType(typeof(MyMetaDataClass))] 
public partial class Article { } 

注意:你不需要指定任何東西在類中,只是元數據類型。

+0

baddie,你缺乏清晰度 – 2010-02-17 14:11:37

2

謝謝,但問題是M小號定義MetadataTypeAttrubute的原型

[AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 
public sealed class MetadataTypeAttribute : Attribute 

那麼,你只好用類而不是接口


從中國 林李:李曉強 [email protected](MSN) lixiaoqiang @ webservice.com.cn

+1

它甚至可以與界面一起工作,無論定義如何。 – 2010-02-26 11:31:26

+0

我不能使它既不工作也不接口類:(我試圖添加IgnoreDataMember到一些我在WCF項目中的部分類的自動生成的屬性 – 2014-09-23 03:42:27