4

私のデータベースには、null許容ではないフィールドがありますが、空の文字列を含めることができます。connection.SaveChanges()を使用してレコードを保存しようとすると、「MyFieldフィールドが必要です」という例外が発生します。

次のようにBuddyClassを作成しましたが、それでも次のメッセージが表示されます。

namespace MyNamespace {
[MetadataType(typeof(QuesT_Metadata))] public partial class QuesT { }
public class QuesT_Metadata {
    [Required(AllowEmptyStrings = true)
    public string MyField { get; set; }
}
}

ErrorMessage属性を使用して、スローされたエラーのメッセージを変更できるため、Buddy Classが正しく機能していることはわかっていますが、Required属性は正しく機能していないようです。

属性DisplayFormat(ConvertEmptyStringToNull = false)も含めてみましたが、同じ結果が得られました。

私は以前にこれを行ったことがありますが、以下の最初の参照もそれが機能するはずだと言っているようですので、私は困惑しています。誰か助けてもらえますか?

参考資料(最初の2つだけが直接関連しているように見えますが、他の2つはまだ役立つ場合があります):

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.allowemptystrings.aspx
http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute .convertemptystringtonull.aspx EntityFramework
プロパティをNOTNULLにする方法、ただしフォーム送信では必須では
ないMVCアプリでバディクラスメタデータを使用してデータ注釈属性が機能しない
EFバディクラスでカスタム属性(AttributeTargets.Class)を使用したデータ検証

4

2 に答える 2

1

私はここで同じ船に乗っています...私はあなたの正確な行動のいくつかの例を持っていますが、それらはうまく機能しています...

そして今、1つの特定のフィールドは動作しません...

ただし、「Required(AllowEmptyStrings = true)」属性を省略した場合は、正常に機能するようになります。問題の属性はそれほど意味がないので、これが私が本当に探しているものだと思います(必須ですが、ユーザーが応答しないようにします)。

私にとってより大きな問題は、なぜそれが時々機能するのか、そして時々機能しないのかということです。

しかし、少なくとも、コードのようなものを削除すると、問題が解決するはずです。

于 2015-01-12T14:47:01.240 に答える
0

私はエラーをトラップすることでこれを回避しました:

public static class ExtensionMethods {
public static void SaveChangesWithEmptyStrings(this DbContext context) {
    try {
        context.SaveChanges();
    }
    catch (DbEntityValidationException ex) {
        foreach (DbEntityValidationResult result in ex.EntityValidationErrors)
            foreach (DbValidationError error in result.ValidationErrors) {
                Type t = result.Entry.Entity.GetType();
                PropertyInfo pi = t.GetProperty(error.PropertyName);
                pi.SetValue(result.Entry.Entity, "");
            }
        context.SaveChanges(); // Try again
    }
}

}

于 2015-01-12T18:18:51.247 に答える