找出在实体框架中导致异常的确切实体 [英] find out the exact entity causing an exception in entity framework
问题描述
实体框架给出了异常中的通用消息,而不告诉我确切的实体和导致错误的属性。如何获取有关该错误的更多信息?
The entity framework gives me generic messages in the exception without telling me the exact entity and the attribute which caused the error. How do I get more information about the error?
这种情况发生在许多情况下,例如
This happens in many cases such as
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,将相关的外键属性设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,否则必须删除不相关的对象。
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
和
将datetime2数据类型转换为datetime数据类型导致超出范围的值。该声明已被终止。
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. The statement has been terminated.
异常详细信息:
[SqlException(0x80131904))将datetime2数据类型转换为datetime数据类型导致超出范围值。
该语句已被终止。]
System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection)+404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()+412
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)+2660
System.Data.SqlClient.SqlDataReader.ConsumeMetaData()+59
System.Data.SqlClient.SqlDataReader.get_MetaData()+118
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)+6431425
System.Data.SqlClient。 SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)+6432994
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,St ring方法,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
System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator翻译器,EntityConnection连接,Dictionary2 identifierValues,List
1 generatedValues)+270
System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)+391
[SqlException (0x80131904): The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. The statement has been terminated.] System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +404 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2660 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +59 System.Data.SqlClient.SqlDataReader.get_MetaData() +118 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6431425 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6432994 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +538 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +28 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +256 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +19 System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary
2 identifierValues, List
1 generatedValues) +270 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) +391
[UpdateException:更新条目时出错。查看内部异常的详细信息。]
System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter适配器)+11223976
System.Data.Objects.ObjectContext.SaveChanges(SaveOptions选项)+833
System.Data.Entity.Internal.InternalContext.SaveChanges()+218
[UpdateException: An error occurred while updating the entries. See the inner exception for details.] System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) +11223976 System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) +833 System.Data.Entity.Internal.InternalContext.SaveChanges() +218
[DbUpdateException:更新条目时出错。查看内部异常的详细信息。]
System.Data.Entity.Internal.InternalContext.SaveChanges()+291
[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.] System.Data.Entity.Internal.InternalContext.SaveChanges() +291
推荐答案
这是我的解决方案中的代码:
Here's the code I have in my solution:
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的所有详细信息。
You can use it as a basis to add into your solution ... it builds a nested set of exceptions with all the details from Entity Framework.
这篇关于找出在实体框架中导致异常的确切实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!