【发布时间】:2020-08-24 11:40:34
【问题描述】:
我的情景是:我们有一个生产数据库和一个集成数据库,我编写了一个工具来将生产数据库的一些数据迁移到集成数据库。为此,我使用:Entity Framework 6.0、.NET-Framework 4.5.2,数据库为 MS SQL Server Standard(64 位)13.0.5102。
我的问题:在保存集成数据库中所有数据的删除时,SaveChanges 方法抛出带有错误消息的DbUpdateConcurrencyException
存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。
以下是通过异常的代码:
using (var prod = new DbProdContext())
{
using (var @int = new DbIntContext())
using (var transaction = @int.Database.BeginTransaction(IsolationLevel.Serializable))
{
try
{
var stack = BuildStack(@int, ...); // buikds a stack of the tables where the latest pushed tables depdend only on already pushed tables
// Deleting everything in db
using (var x = log4net.NDC.Push("Deleting old content"))
{
foreach (var table in stack.Reverse())
{
var destSet = table.DestSet;
destSet.RemoveRange(destSet);
}
log.Info("Saving Changes...");
@int.SaveChanges(); // <-- throw exception
log.Info("Completed Saving Changes");
}
// code to insert the data
transaction.Commit();
}
catch (Exception ex)
{
// log
transaction.Rollback();
}
}
}
注意:变量stack 是集成数据库中表的堆栈,其中对于任何给定的表t,t 所依赖的所有表在t 被压入堆栈之前被压入堆栈.
第二个注意事项:我测试了代码,将生产数据库的本地测试克隆中的数据迁移到从未抛出此异常的集成数据库中。
有没有人知道如何防止这个错误或导致它的原因。
第三个注意事项:它当前注意的正在使用的集成数据库不能从不同的进程对数据库进行并发更改。
我是否应该只为表创建 sql drop 语句而不是使用destSet.RemoveRange(destSet)
【问题讨论】:
标签: c# sql entity-framework