2013-05-02 5 views
6

エンティティフレームワークは、エラーの原因となった正確なエンティティと属性を知らせることなく、例外で汎用メッセージを返します。エラーの詳細情報を入手するにはどうすればよいですか?エンティティフレームワークで例外を引き起こす正確なエンティティを見つけよう

これは、このような

として、多くの場合、操作が失敗起こる:外部キー特性の1つ以上が非NULL可能であるため、関係を変更することができませんでした。リレーションシップが変更されると、関連する外部キー・プロパティーはNULL値に設定されます。外部キーがNULL値をサポートしていない場合は、新しい関係を定義する必要があります。また、外部キー・プロパティーに別の非NULL値を割り当てる必要があります。

datetimeデータ型にDATETIME2データ型の変換は、範囲外の値をもたらしました。ステートメントは終了されました。

例外の詳細:

[SQLExceptionが(0x80131904):datetimeデータ型にDATETIME2データ型の変換は、範囲外の値をもたらしました。 ステートメントが終了しました。] System.Data.SqlClient.SqlConnection.OnError(SQLException例外、ブールbreakConnection)404 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()412 System.Data.SqlClient.TdsParser。ファイル名を指定して実行(runBehavior runBehavior、SqlCommandオブジェクトcmdHandler、SqlDataReaderのデータストリーム、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj)2660 System.Data.SqlClient.SqlDataReader.ConsumeMetaData()59 System.Data.SqlClient.SqlDataReader.get_MetaData()118 システム。 DataBaseから継承されます。 、Boolean returnStream、Boolean async)+6432994 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean戻り値、Stringメソッド、DbAsyncResult結果)+538 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior 、RunBehavior runBehavior、Boolean returnStream、String method)+28 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehaviorビヘイビア、Stringメソッド)+256 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehaviorビヘイビア)+19 システム。 (UpdateTranslatorトランスレータ、EntityConnection接続、辞書2 identifierValues, List 1 generatedValues)+270 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManag er stateManager、IEntityAdapterアダプター)+391

[UpdateException:エントリーの更新中にエラーが発生しました。詳細については内部例外を参照してください。] System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager、IEntityAdapterアダプタ)+11223976 System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)+833 システム。 Data.Entity.Internal.InternalContext.SaveChanges()+218

[DbUpdateException:エントリの更新中にエラーが発生しました。詳細については内部例外を参照してください。] System.Data.Entity。Internal.InternalContext.SaveChanges()291

+0

あなたは 'Datetime2'を使用しているどのように多くの場所? [this](http://stackoverflow.com/a/1334193/1466627)を読んでください。 –

答えて

7

ここで私は私の解決策を持っているコードです:

try 
{ 
    _context.SaveChanges(); 
} 
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) 
{ 
    Exception raise = dbEx; 
    foreach (var validationErrors in dbEx.EntityValidationErrors) 
    { 
     foreach (var validationError in validationErrors.ValidationErrors) 
     { 
      string message = string.Format("{0}:{1}", validationErrors.Entry.Entity.ToString(), validationError.ErrorMessage); 
      //raise a new exception inserting the current one as the InnerException 
      raise = new InvalidOperationException(message , raise); 
     } 
    } 
    throw raise; 
} 

あなたはあなたのソリューションに追加するための基礎として使用することができますが...それは、ネストされたを構築しますEntity Frameworkのすべての詳細を含む一連の例外。

+0

私はこれが最初のエラーには良いと思いますが、2番目のエラーでは 'DbEntityValidationException'を取得しません。これを取得します:' [DbUpdateException:エントリの更新中にエラーが発生しました。詳細は内部例外を参照してください。] – chadisbad

+0

@chadisbad内部例外は何を言いますか? – qujck

+0

内部例外は 'datetime2データ型からdatetimeデータ型への変換は範囲外の値になりました。文が終了しました。「例外の原因となる特定のエンティティおよび属性(列)を検出できるかどうかを知りたい。 – chadisbad

1

あなたは、リポジトリのテストを書いて、あなたのテストのための基本クラスにする必要があります:

try 
{ 
    DbContext.SaveChanges(); 
} 
catch (DbEntityValidationException e) 
{ 
    e.EntityValidationErrors.SelectMany(error => error.ValidationErrors).ToList().ForEach(
    item => Console.WriteLine("{0} - {1}", item.PropertyName, item.ErrorMessage)); 
    throw; 
} 
+0

と同じではない可能性がありますが、上記のソリューションはMySqlデータベースでは機能しません。 MySqlコネクタがMySql.Data.MySqlClient.MySqlException型の例外をスローするとき。どんなアイデアでも、この場合は何ができるでしょうか? –

関連する問題