Платформа объекта детали ошибки SaveChanges

При сохранении изменений с SaveChanges на данных контекст является там способом определить, какой Объект вызывает ошибку? Например, иногда я буду забывать присваивать дату не допускающему NULL-значения полю даты и получать "Недопустимый Диапазон дат" ошибка, но я не получаю информации, о котором объекте, или который поле это вызывается (я могу обычно разыскивать его путем кропотливого прохождения через всех моих объектов, но это является очень трудоемким). Отслеживание стека довольно бесполезно, поскольку оно только показывает мне ошибку в SaveChanges звоните без любой дополнительной информации как, туда, где точно это произошло.

Обратите внимание, что я не надеюсь решать какую-то конкретную проблему, которую я имею теперь, я был бы точно так же, как для знания в целом, если существует способ сказать, какой объект/поле вызывает проблему.


Быстрый образец отслеживания стека как пример - в этом случае ошибка произошел потому что CreatedOn дата не была назначена на IAComment объект, однако невозможно сказать от этой ошибки/отслеживания стека

    [SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.]
   System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan value) +2127345
   System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime value) +232
   System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime, Byte cb) +46
   System.Data.SqlClient.TdsParser.WriteValue(Object value, MetaType type, Byte scale, Int32 actualLength, Int32 encodingByteSize, Int32 offset, TdsParserStateObject stateObj) +4997789
   System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc) +6248
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
   System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues) +8084396
   System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) +267

[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) +389
   System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) +163
   System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) +609
   IADAL.IAController.Save(IAHeader head) in C:\Projects\IA\IADAL\IAController.cs:61
   IA.IAForm.saveForm(Boolean validate) in C:\Projects\IA\IA\IAForm.aspx.cs:198
   IA.IAForm.advance_Click(Object sender, EventArgs e) in C:\Projects\IA\IA\IAForm.aspx.cs:287
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5019
22
задан Marek Karbarz 4 March 2010 в 21:13
поделиться

3 ответа

Одним из вариантов является обработка события ObjectContext.SavingChanges Event, которое дает вам возможность выполнить проверку сущностей перед сохранением изменений и даже отменить сохранение, если это необходимо. Таким образом, вы можете убедиться, что все ненулевые свойства установлены до попытки сохранения изменений, и избежать необходимости полагаться на обработку исключений.

7
ответ дан 29 November 2019 в 05:57
поделиться

Я думаю, что это невозможно: вы можете поиграть с состояниями объектов, чтобы узнать, какие из них будут сохранены (перед сохранением), а какие - (в исключении), но во втором наборе вы не сможете узнать, какой из них вызвал исключение. .

Испанская версия: http://msdn.microsoft.com/es-es/library/cc716714.aspx

Английский: http://msdn.microsoft.com/en-us/ library / cc716714.aspx

0
ответ дан 29 November 2019 в 05:57
поделиться

Я думаю, что я мог бы сделать отдельные звонки в SaveChanges(). Обычно именно по этой причине я это делаю.Могу ли я спросить, почему вы сохраняете несколько сущностей одновременно? Если вам нужно, я бы последовал совету другого парня и заранее проверил бы сущности.

Или, может быть, есть лучший способ структурировать ваш код так, чтобы в действительных entiies даже не пытались быть сохраненными. Возможно, отсоедините сущности, а затем запустите их с помощью метода проверки, прежде чем присоединять их к новому контексту. Надеюсь, что поможет!

0
ответ дан 29 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: