Я хочу заменить существующие записи в БД с новыми записями в одной транзакции. Использование транссулях, у меня
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.
после некоторой пробной и ошибки, я Нашел виновник заключается в том, что нет никаких других инструкций для выполнения между удалением и вставкой. Если я вставил другой код между первыми Dublitchanges () и insertallonSubmit (), все работает нормально. Может ли кто-нибудь объяснить, почему это происходит? Это очень относительно.
Я попробовал еще один, чтобы обновить объекты:
IEnumerable<Task> tasks = ( ... some long query that involves multi tables )
.AsEnumerable()
.Select( i =>
{
i.Task.Duration += i.LastLegDuration;
return i.Task;
}
db.SubmitChanges();
Это не сработало ни один. БД не поднял никаких изменений в задачи.
Редактировать:
Это поведение Похоже, не имеет ничего общего с транзакциями. В конце концов, я принял грубо неэффективное обновление:
newTasks.ForEach( t =>
{
Task attached = db.Tasks.Single( i => ... use primary id to look up ... );
attached.Duration = ...;
... more updates, Property by Property ...
}
db.SubmitChanges();