【问题标题】:EF Core removerange items not removed on transactionEF Core removerange 未在事务中删除的项目
【发布时间】:2016-12-03 05:57:26
【问题描述】:

这是我的问题

using (var db = new CassaContext()) {        
      var DbSet = db.GetByName(item.Name);
      DbSet.RemoveRange(DbSet);

      for (var i = 0; i < data.Count; i++)
      {
           JObject jitem = data[i] as JObject;
           var dbobj = vm.Db.JsonToObject(jitem);             
           DbSet.Add(dbobj);
       }

       db.SaveChanges();
}

如果我将在 RemoveRange() 指令之后添加 db.SaveChanges(),一切都很好,但是,没有它,我就会出错

无法跟踪实体类型“用户”的实例,因为 另一个具有相同密钥的此类实例已经在 跟踪。添加新实体时,对于大多数键类型,一个唯一的 如果没有设置键(即如果键 属性被赋予其类型的默认值)。如果你是 为新实体显式设置键值,确保它们不会 与现有实体或为其他生成的临时值发生冲突 新实体。附加现有实体时,确保只有一个 具有给定键值的实体实例附加到上下文。

我想避免在 removerange 之后保存,因为如果事务失败,我不会有空表。

我该如何解决这个问题?提前致谢! 如果您需要更多,请询问!

【问题讨论】:

  • 异常很明显:已经在跟踪另一个具有相同密钥的此类实例。您添加了一个刚刚删除的实体。
  • 那会是什么问题?它也在 EF7 上工作。我想,我可以在数据库中插入和删除实体。

标签: c# entity-framework sqlite uwp entity-framework-core


【解决方案1】:

不确定这个错误,但您可以尝试使用显式事务:

using (var db = new CassaContext())
using (var transaction = db.Database.BeginTransaction())
{
    var DbSet = db.GetByName(item.Name);
    DbSet.RemoveRange(DbSet);
    db.SaveChanges();

    for (var i = 0; i < data.Count; i++)
    {
        JObject jitem = data[i] as JObject;
        var dbobj = vm.Db.JsonToObject(jitem);             
        DbSet.Add(dbobj);
    }
    db.SaveChanges();

    transaction.Commit();
}

【讨论】:

  • 谢谢!它完成了工作!它似乎也能正常工作,即使在交易错误时也是如此。我不认为要使用显式事务,因为它在 EF7 上工作。再次感谢
【解决方案2】:

这是您的问题,在 Entityframework 中,您必须在每次 database 执行后编写 savechange。因此,你的函数应该是这样的

using (var db = new CassaContext()) {        
  var DbSet = db.GetByName(item.Name);
  DbSet.RemoveRange(DbSet);
  db.SaveChanges();
  for (var i = 0; i < data.Count; i++)
  {
       JObject jitem = data[i] as JObject;
       var dbobj = vm.Db.JsonToObject(jitem);             
       DbSet.Add(dbobj);
       db.SaveChanges();
   }

   db.SaveChanges();

}

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多