2012-03-06 24 views
9

私はEntity Framework 4.3でコードワースト開発を行っていますが、属性注釈やその他の手段でCHECK constraintを表現することはできません。私はEF 5.0がchecking enumerationsのサポートを追加することを見ていますが、それは私がここにいるのとまったく同じではありません。チェック制約を表現することは可能ですか?

簡略化すると、すべてのPersonオブジェクトの名前が "Bob"または "Harry"で、5,10,30歳のいずれかであることを検証したいと思います。

public class Person 
{ 
    [Required] 
    [Check("Bob", "Harry")] //yes, this attribute is imaginary 
    public string FirstName { get; set; } 

    [Required, Check(5, 30, 50)] //check is still imaginary 
    public int Age { get; set; } 
} 

私は事実の後にこれらの制約を追加するには、alterスクリプトを実行することができますし、私は検証を実行するために自分自身のチェック属性をロールバックすることができますが、私は実際に非列挙CHECK制約を表現するために欠けている方法がありますエンティティフレームワーク?

答えて

3

あなたは(未テスト)1を自分で書くことができます:

public class CheckAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute 
{ 
    object[] ValidValues; 

    public CheckAttribute<T>(params T[] validValues) 
    { 
     ValidValues = validValues; 
    } 

    public override bool IsValid(object value) 
    { 
     return ValidValues.FirstOrDefault(v => v.Equals(value)) != null; 
    } 
} 
+0

が、私のこれはドメイン限定の属性だということです。チェック制約があるバッキングテーブルエンティティには反映されません。たとえば、文字列のMaxLengthがテーブル構造に反映されるのと同じ方法です。 – 48klocs

+1

私はEFに精通しているわけではありませんが、ILSpyで 'EntityFramework.dll'を開き、' System.Data.Entity.Internal.Validation.EntityValidatorBuilder'が属性の分析と何をすべきかを決定するように見えますそれら。 'RequiredAttribute'、' MaxLengthAttribute'、 'StringLengthAttribute'、' DisplayAttribute'は基本的にデータベース作成プロセスに組み込まれているように見えます。私は今日のようにEFであなたがしていることをすることが可能かどうかはわかりません。 –

4

私は制約をチェック入れたい、としてきたM.によってここに与えられた答えのようにそれを行うにはいくつかの方法がありながら、 Babcockを使用し、イニシャライザでExecuteSqlを使用してデータベースに手動で制約を追加します。

しかし、私は最も簡単な方法は、あなたの例では、あなたが行くと思いので、正規表現のアノテーションを使用することだと思う。(それはあなたに不気味に似ています)私は自分のチェック属性を書きました

<!-- language: c# --> 
public class Person 
{ 
    [Required] 
    [RegularExpression(@"Bob|Harry")] 
    public string FirstName { get; set; } 

    [Required, RegularExpression(@"5|30|50")] 
    public int Age { get; set; } 
} 
+0

これは、チェック制約が正規表現によって検証できる場合にのみ機能します。これはOPの//単純化された例//で動作します。それ以外の場合は、@ M.Babcockで説明されているカスタム検証が便利です。 –

関連する問題