实体框架:在单个请求中删除和添加具有相同键的实体

本文关键字:实体 添加 删除 框架 单个 请求 | 更新日期: 2023-09-27 17:59:17

我需要在一个请求中删除和添加具有相同主键值的实体,有人能给我建议解决方案吗?

下面是我给出错误的示例代码:违反PRIMARY KEY约束"PK_Table"。无法在对象"dbo.Table"中插入重复的密钥.

context.Set<Entity>().Attach(existingEntityObj);
Entry(existingEntityObj).State = EntityState.Deleted;
context.Set<Entity>().Add(newEntityObj);
context.Entry<Entity>(newEntityObj).State = EntityState.Added;
context.SaveChanges();

假设两个对象(existingEntityObj和newEntityObj)在主键属性中具有相同的值。

提前感谢!!

实体框架:在单个请求中删除和添加具有相同键的实体

您需要执行两个SaveChanges()调用才能使其工作。这里的问题是,虽然看起来是先删除记录,然后添加新记录,但框架实际上是先插入的。

原因是Entity Framework不能让你对操作的顺序进行精细控制。因此,你最好的选择是将两者封装在单独的TransactionScope中,这样你就可以控制正在发生的单个事务。

您可以在此处阅读更多信息:https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

如果您想保持相同的主键值,那么单个更新语句可以对您起作用,因此解决方案是用新的实体值更新旧实体。由于主键标识一个实体,删除旧实体并添加新实体将具有与更新相同的效果。

如果你觉得我错了,给我一个完美的例子,纠正我。

您也可以尝试使用显式DbContextTransaction,比如:

using (DbContextTransaction transaction = context.Database.BeginTransaction())
{
  context.DoSomething();
  context.SaveChanges();
  context.DoSomethingElse();
  context.SaveChanges();
  transaction.Commit();
}

不要忘记捕获异常,然后进行事务处理。回滚();