2011-03-13 6 views
12

データアノテーション属性がStringLengthで、長さが100文字に設定されたdescriptionプロパティを持つモデルクラスがあります。このプロパティが100文字を超え、Entity Frameworkがこのプロパティを保存しようとすると、次のエラーが発生します。C#DataAnnotations StringLengthとSubStringを使用してテキストを削除する方法

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
     public string Description { get; set; } 

エラー:
「検証は、1つのまたは複数のエンティティのために失敗した詳細については、 『EntityValidationErrors』プロパティを参照してください」

を私はこれが解決策を形成するのに役立ちますかどうかわからないんだけど、I Entity Framework CTP5とコードファーストを使用しています。

説明が100文字を超える場合は、100文字を超える文字を削除して、説明を保存してエラーを発生させないようにします。

DataAnnotation属性StringLengthを手動で使用して、有効な長さの説明を識別し、有効な量以上の文字を取り除くのに役立つはずです。

誰でもこの状況でDataAnnotationを使用する方法を知っていますか?または、利用可能な別のオプションがありますか?


更新私はBrokenGlassが提案何をした とここに私の実装場合:そのアプローチではないですが、あなたはいつも、リフレクションを使用して属性値をチェックすることができ

public static class DataAnnotation 
{ 
    public static int? GetMaxLengthFromStringLengthAttribute(Type modelClass, string propertyName) 
    { 
     int? maxLength = null; 
     var attribute = modelClass.GetProperties() 
         .Where(p => p.Name == propertyName) 
         .Single() 
         .GetCustomAttributes(typeof(StringLengthAttribute), true) 
         .Single() as StringLengthAttribute; 

     if (attribute != null) 
      maxLength = attribute.MaximumLength; 

     return maxLength; 
    } 
} 


int? maxLength = DataAnnotation.GetMaxLengthFromStringLengthAttribute(typeof(Car), "Description"); 

if(maxLength != null && car.Description.Length > maxLength) 
    car.Description = car.Description.Substring(0, maxLength.Value); 

BarDev

+0

この質問に追加する必要があるタグはありますか? –

+0

DataAnnotationについてよく知りません。他のオプションについては、getter/setterを実装し、setterでチェック/切り捨てを行うだけです。 – Rob

+0

提案していただきありがとうございます。私はちょうどそれを回避するためにしました。私はおそらくこの問題を複雑にしています。しかし、私は、Validationや余分な文字を削除したい場合など、さまざまな状況を見ることができます。私のWCFアプリケーションでは、余分な文字を削除してエラーを発生させたくないですが、ASP.NETやWin Formsのようなデータ入力アプリケーションでは、ユーザーに検証メッセージを出したいと思います。 –

答えて

9

あなたが周りを回ることができれば最高です - それはきれいではありません:

var attribute = typeof(ModelClass).GetProperties() 
            .Where(p => p.Name == "Description") 
            .Single() 
            .GetCustomAttributes(typeof(StringLengthAttribute), true) 
            .Single() as StringLengthAttribute; 

Console.WriteLine("Maximum Length: {0}", attribute.MaximumLength);  
+0

これを使うかもしれません。私はこれをカプセル化して自分のコードのどこからでも呼び出すことができます。私はもう少し待って、さらに答えが得られるかどうかを見ます。答えをありがとう。 –

2

長さのデータ注釈を持たないビューモデルを作成し、それをエンティティモデルにマップし、100より長い場合は値を切り捨てることができます。

+0

コードを繰り返す必要がないように、私はMVC3アプリケーションでの譲渡のためにデータ注釈が必要であると述べたはずです。 –

+0

すべては、制約を適用する場所によって異なります。私は "データ"モデルをきれいに保ち、ViewModelに検証を強制して、ViewModelに注釈が付くようにします。 –

10

なぜすべての面倒ですか?どうしてですか

private string _description = string.Empty; 

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
public string Description 
{ 
    get { return _description; } 
    set { _description = value.Substring(0,100); }; // or something equivalent 
} 
+8

あなたの 'set'は検証を完全に破っています。それは無意味です。検証するか、切り捨てます。しかし、サイレントに切り詰めることは恐ろしい、恐ろしい考えです。 – ErikE

関連する問題