У меня есть следующий код в моем веб-сайте (например, очень-очень упрощен для SO, конечно):DataContext.SubmitChanges() представляет нежелательные данные
XDataContext dataContext = new XDataContext();
int currentUserId = GetCurrentUserIdFromSession();
XUser currentUser = dataContext.Users.Single(u => u.Id == currentUserId);
try
{
using (var t = new TransactionScope())
{
int orderId = GetOrderIdFromSession();
XOrder order = dataContext.Orders.Single(o => o.Id == orderId);
order.Status = XOrderStatus.Completed;
order.TransactionId = SomeCalculations(); // exception here
order.CompletedOn = DateTime.UtcNow;
dataContext.SubmitChanges(); // 1
t.Complete();
}
}
catch (Exception ex)
{
XExceptionEvent exceptionEvent = new XExceptionEvent();
exceptionEvent.User = currentUser;
dataContext.ExceptionEvents.InsertOnSubmit(exceptionEvent);
dataContext.SubmitChanges(); // 2
}
Когда SomeCalculations()
бросает исключение, order
объект находится в несоответствующее состояние (Status
- XOrderStatus.Completed
, но CompletedOn
не установлен). dataContext.SubmitChanges(); // 1
не называется, здесь все хорошо. НО. Вы видите dataContext.SubmitChanges(); // 2
. Это называется. И вместе с XExceptionEvent он отправляет нежелательные изменения order
в мою базу данных.
Хорошо. Я попытался создать еще один XDataContext
для исключений. Но exceptionsDataContext.SubmitChanges();
говорит, что currentUser
загружается через разные XDataContext
. Есть идеи? Есть ли элегантный способ отмены недействительных изменений моего order
?
Как я уже отмечал, я попытался отказаться от 'XDataContext', но у меня есть« XUser currentUser », созданный в этом контексте. Поэтому я вынужден использовать старый XDataContext, и в настоящее время я искал способ отбросить все изменения элегантно. – Denis
Это относится к категории «это * не * ОК, чтобы отменить несохраненные изменения сущности». Взгляните на http://graemehill.ca/discard-changes-in-linq-to-sql-datacontext/ –
Это работает! Спасибо. – Denis