2009-10-08 18 views
12

Linq to SQLオブジェクトにデータアノテーションを実装しようとしています。 .dbmlファイルが生成され、生成されたソースコードに触れることなくデータアノテーションをオブジェクトに追加する方法がわかりません。LinqからSQLへのデータアノテーションのバリデーション

オブジェクトの別の部分クラスにデータ注釈を追加しようとしましたが、認識できない、インテリセンスがありません。その後、というクラスについては

答えて

22

私がこの質問に対する私の元の答えで言ったように、あなたはインターフェースを使うべきです。答えは、授業を利用すると言った鉱山(Acceptedとマークされています)の後に投稿されました。これはあまり良くありません。インタフェースは、次の理由のためのより良いオプションです:

  • 名の間に不一致があなたのインターフェイスであなたのLINQのクラスと名前で存在する場合、コンパイラはあなた
  • ためのフラグをインタフェースはできないだろうインスタンス化することは、これは偶然あなたがReSharperの(または類似)を使用する場合、インターフェイスは自動的に
  • インターフェースは空のクラスよりも少ない冗長ですLINQクラスから抽出することができ
  • メタデータ型をinstatntiatingからクラスのユーザーを保護し
  • intに対してプログラムする場合あなたのメタデータタイプとして使用できるインターフェイスが既に用意されています

「ユーザー」と呼ばれるクラスの場合は、その後、「たIUser」)、および以下のようにあなたの部分Userクラスの定義を更新:

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

次に、あなたたIUserインターフェースでは、適切なデータ注釈は、プロパティに属性を追加:

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

私はインターフェイスに[Bind(Exclude = "ID")]属性を追加できないことを除いて、このアプローチが本当に好きです。クラス。これはうまくいくが、メタデータはクラスとインタフェースの間で分割されるようになった。 – palmsey

+0

私のモデルに余分なフィールドがある場合はどうすればよいですか?例えば、私は追加の 'Confirm Password'フィールドを持っています。私がこのフィールドをインターフェイスコンパイラに入れると、LinqベースのSQLクラスにそのようなフィールドがないので、これを渡すことはありません。 – kseen

+0

これらの属性は自動的にどのように生成されますか? dbmlには、それらを生成するために必要なものすべてがあります。私はそれぞれに数十の列で20のテーブルを持っています...私は手動でそれを維持しようとするつもりはありません。誰にでも解決策がありますか? –

9

、「ユーザー」と言う、それのためのインターフェイスを作成する(「たIUser」を言う)、および以下のようにあなたの部分Userクラスの定義を更新:

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

次に、あなたの中にIUserインターフェイスで、プロパティに適切なデータ注釈属性を追加します。

6

Linq to SQLは、オブジェクトクラスを部分的に生成します。データアノテーションを実装する簡単な方法は、オブジェクトの独自の部分クラスを作成し、作成した部分クラスに[MetadataType(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; } 
} 

を検証したい各フィールドのメタデータを使用して独自のメタデータクラスを作成します。この場合記事クラス:

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

注:何も指定する必要はありませんクラス内では、メタデータ型だけです。

+0

baddie、あなたには分かりません –

2

おかげで、問題はMです李晓强 [email protected](MSN) lixiaoqiang @:Sだから

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

としてMetadataTypeAttrubuteのプロトタイプを定義するには、クラスを使用しますが、

中国 森リーから

をインターフェースないしなければなりませんでしたwebservice.com.cn

+1

定義に関係なくインターフェイスでも動作します –

+0

私はそれもインターフェイスもクラスも動作させることはできません:(ImはIgnoreDataMemberをいくつかのWCFプロジェクトでの私の部分クラスの自動生成プロパティ –