1. ホーム
  2. c#

[解決済み】DbEntityValidationException - エラーの原因を簡単に知るにはどうすればよいですか?

2022-04-18 15:15:58

質問

Entity Frameworkを使用したプロジェクトがあります。を呼び出しながら SaveChanges の上で DbContext を実行すると、次のような例外が発生します。

System.Data.Entity.Validation.DbEntityValidationException: バリデーション が 1 つまたは複数のエンティティで失敗しました。EntityValidationErrors' プロパティを参照してください。 を参照してください。

これはこれでいいのですが、この例外が発生するたびにデバッガーを添付するのは嫌です。さらに言えば、本番環境ではデバッガを簡単に導入できないので、わざわざこのエラーを再現する必要があります。

の中に隠された詳細を見るにはどうすればよいのでしょうか? DbEntityValidationException ?

解決方法は?

最も簡単な解決策は SaveChanges をエンティティクラスで使用します。をキャッチすることができます。 DbEntityValidationException を作成し、実際のエラーをアンラップして、新しい DbEntityValidationException を改良したメッセージで表示します。

  1. SomethingSomething.Context.cs ファイルの横に、パーシャルクラスを作成します。
  2. この記事の一番下にあるコードを使用します。
  3. これだけです。あなたの実装はリファクタリングなしで自動的にオーバーライドされたSaveChangesを使用するようになります。

例外メッセージは次のようになります。

System.Data.Entity.Validation.DbEntityValidationException: バリデーション が 1 つまたは複数のエンティティで失敗しました。EntityValidationErrors' プロパティを参照してください。 を参照してください。バリデーションエラーは以下の通りです。フィールドPhoneNumber は、最大長 '12' の文字列または配列型である必要があります。 LastName フィールドは必須です。

を継承する任意のクラスでオーバーライドされたSaveChangesをドロップすることができます。 DbContext :

public partial class SomethingSomethingEntities
{
    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            // Retrieve the error messages as a list of strings.
            var errorMessages = ex.EntityValidationErrors
                    .SelectMany(x => x.ValidationErrors)
                    .Select(x => x.ErrorMessage);
    
            // Join the list to a single string.
            var fullErrorMessage = string.Join("; ", errorMessages);
    
            // Combine the original exception message with the new one.
            var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
    
            // Throw a new DbEntityValidationException with the improved exception message.
            throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
        }
    }
}

DbEntityValidationException には、バリデーション・エラーの原因となったエンティティも含まれています。したがって、さらに多くの情報が必要な場合は、上記のコードを変更して、これらのエンティティに関する情報を出力することができます。

こちらもご覧ください。 http://devillers.nl/improving-dbentityvalidationexception/