【问题标题】:Entity Framework: Remove and Add entities with same key in a single request实体框架:在单个请求中删除和添加具有相同键的实体
【发布时间】:2016-07-29 16:58:23
【问题描述】:

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

以下是给出错误的示例代码:违反主键约束“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)在主键属性中具有相同的值。

提前致谢!!

【问题讨论】:

  • 您必须删除主键约束,删除您的实体,添加您的实体,然后重新添加主键约束。但是,当 FK 引用它时,您不能删除主键约束。你在做什么听起来是个坏主意。你不能只用新对象的数据修改现有对象吗?

标签: c# entity-framework orm code-first


【解决方案1】:

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

原因是因为实体框架不能让您精细控制操作发生的顺序。所以最好的办法是将两者包装在单独的 TransactionScope 中,这样您就可以控制正在发生的单个事务.

你可以在这里阅读更多:https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您也可以尝试使用显式 DbContextTransaction,如下所示:

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

    别忘了也捕获异常然后执行 transaction.Rollback();

    【讨论】:

    • 它只适用于 EF 6.x
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 2021-12-04
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2018-06-29
    • 2020-11-23
    相关资源
    最近更新 更多