12

Linq to SQL オブジェクトにデータ注釈を実装しようとしています。.dbml ファイルが生成されますが、生成されたソース コードに触れずにオブジェクトにデータ注釈を追加する方法がわかりません。

オブジェクトの別の部分クラスにデータ注釈を追加しようとしましたが、それを認識せず、Intelli の意味もありません。

4

4 に答える 4

22

この質問に対する最初の回答で述べたように、インターフェイスを使用する必要があります。私の後に投稿された回答(承認済みとしてマークされた)は、クラスを使用すると述べました。これはそれほど良くありません。次の理由から、インターフェイスの方が適しています。

  • LINQクラスの名前とインターフェイスの名前の間に不一致がある場合、コンパイラはそれにフラグを立てます
  • インターフェイスをインスタンス化できないため、クラスユーザーが誤ってメタデータタイプをインスタンス化するのを防ぎます。
  • Resharper(または同様のもの)を使用する場合、インターフェイスはLINQクラスから自動的に抽出できます
  • インターフェイスは空のクラスよりも冗長ではありません
  • クラスではなくインターフェースに対してプログラミングする場合(これは良い習慣です)、メタデータタイプとして使用できるインターフェースがすでにあります。

「User」というクラスの場合、そのインターフェイス(「IUser」など)を作成してから、部分的なUserクラスの定義を次のように更新します。

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

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

[Required]       
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")]
string Username { get; set; }
于 2009-10-13T04:57:48.950 に答える
9

「User」というクラスの場合、そのインターフェイス(「IUser」など)を作成してから、部分的なUserクラスの定義を次のように更新します。

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

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

[Required]       
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")]
string Username { get; set; }
于 2009-10-11T02:27:33.557 に答える
6

Linq to SQLは、オブジェクトクラスを部分として生成します。データアノテーションを実装する簡単な方法は、オブジェクトの独自の部分クラスを作成し、作成した部分クラスに[MetadataType(typeof(YourDataAnnotationClass))]を配置することです。

例:

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

検証するフィールドごとにメタデータを使用して独自のMetaDataクラスを作成します

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

メタデータを追加するObjectクラス(この場合はArticlesクラス)​​の部分クラスを作成します。

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

注:クラスで何も指定する必要はなく、メタデータタイプのみを指定します。

于 2009-10-11T05:37:01.227 に答える
3

ありがとう、しかし問題はMSがMetadataTypeAttrubuteのプロトタイプを次のように定義することです

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

したがって、クラスを使用する必要がありましたが、インターフェイスは使用しませんでした


チャイナフォレストリーから:李晓强xiaoqianglinsen@163.com(MSN)lixiaoqiang@webservice.com.cn

于 2009-11-26T09:06:04.950 に答える