我希望在一个事务中用新记录替换数据库中的现有记录。使用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();
这也没有起作用。数据库没有捕捉到任务的任何更改。
编辑:
这种行为似乎与事务无关。最终,我采用了极其低效的更新方法:
newTasks.ForEach( t =>
{
Task attached = db.Tasks.Single( i => ... use primary id to look up ... );
attached.Duration = ...;
... more updates, Property by Property ...
}
db.SubmitChanges();