EF Code First: NuGet パッケージ コンソールから 'EntityValidationErrors' プロパティを表示するにはどうすればいいですか? 質問する

EF Code First: NuGet パッケージ コンソールから 'EntityValidationErrors' プロパティを表示するにはどうすればいいですか? 質問する

私はこれについて困惑しています:

エンティティ フレームワーク (4.1.3) コード ファースト アプローチ用にクラスを定義しました。シードを開始するまではすべて順調でした (テーブルなどを作成していました)。

今私が

Add-Migration "remigrate" ; Update-Database;

パッケージ コンソールに「1 つ以上のエンティティの検証に失敗しました。詳細については、「EntityValidationErrors」プロパティを参照してください。」というエラーが表示されます。

Seed() メソッドにブレークポイントを設定していますが、プロジェクトが実行されていないときにコンソールで実行しているため、詳細にアクセスする方法がわかりません(PS - スレッドを見ましたEntity Framework を使用して SQL Server データベースに変更を保存中に、1 つ以上のエンティティの検証に失敗しましたこれは、プロパティを表示する方法を示しています。

メソッド呼び出しの直後に return を置くとエラーがなくなるので、Seed() メソッドに問題があることはわかっています。では、検証エラーが何であるかを確認できるようにブレークポイントを設定するにはどうすればよいでしょうか? ちょっとわかりません。それとも、NuGet コンソールでそれをトレースする他の方法がありますか??

ベストアンサー1

私も最近これに悩まされました。Seed メソッドの Configuration クラスにラッパー関数を配置し、呼び出しをSaveChanges自分の関数の呼び出しに置き換えることでこれを修正しました。この関数は、EntityValidationErrorsコレクション内のエラーを列挙し、例外メッセージに個々の問題がリストされている例外を再スローするだけです。これにより、出力が NuGet パッケージ マネージャー コンソールに表示されます。

コードは次のとおりです:

/// <summary>
/// Wrapper for SaveChanges adding the Validation Messages to the generated exception
/// </summary>
/// <param name="context">The context.</param>
private void SaveChanges(DbContext context) {
    try {
        context.SaveChanges();
    } catch (DbEntityValidationException ex) {
        StringBuilder sb = new StringBuilder();

        foreach (var failure in ex.EntityValidationErrors) {
            sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
            foreach (var error in failure.ValidationErrors) {
                sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                sb.AppendLine();
            }
        }

        throw new DbEntityValidationException(
            "Entity Validation Failed - errors follow:\n" + 
            sb.ToString(), ex
        ); // Add the original exception as the innerException
    }
}

シード メソッド内のの呼び出しをcontext.SaveChanges()に置き換えるだけです。SaveChanges(context)

おすすめ記事