LINQ: Удалить и вставлять те же основные значения ключей в пределах транзакций

Я хочу заменить существующие записи в БД с новыми записями в одной транзакции. Использование транссулях, у меня

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();
15
задан Kirk Broadhurst 28 September 2011 в 02:15
поделиться