Я хочу заменить существующие записи в БД новыми записями в одной транзакции. Используя TransactionScope, у меня есть
using ( var scope = new TransactionScope())
{
db.Tasks.DeleteAllOnSubmit(oldTasks);
db.Tasks.SubmitChanges();
db.Tasks.InsertAllOnSubmit(newTasks);
db.Tasks.SubmitChanges();
scope.Complete();
}
Моя программа скинула
System.InvalidOperationException: Cannot add an entity that already exists.
После некоторых проб и ошибок я обнаружил, что виновник заключается в том, что между удалением и вставкой нет никаких других инструкций выполнения. Если я вставлю другой код между первым SubmitChanges () и InsertAllOnSubmit (), все работает нормально. Кто-нибудь может объяснить, почему это происходит? Это очень касается.
Я попробовал еще один, чтобы обновить объекты:
IEnumerable<Task> tasks = ( ... some long query that involves multi tables )
.AsEnumerable()
.Select( i =>
{
i.Task.Duration += i.LastLegDuration;
return i.Task;
}
db.SubmitChanges();
Это тоже не сработало. БД не внесла никаких изменений в Задачи.
EDIT:
Такое поведение, похоже, не имеет ничего общего с транзакциями. В конце я принял крайне неэффективное обновление:
newTasks.ForEach( t =>
{
Task attached = db.Tasks.Single( i => ... use primary id to look up ... );
attached.Duration = ...;
... more updates, Property by Property ...
}
db.SubmitChanges();