EF Core removrange项目未在事务中删除

本文关键字:事务 删除 Core removrange 项目 EF | 更新日期: 2023-09-27 17:59:15

这是我的问题

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();
}

如果我要添加数据库。SaveChanges()在RemoveRange()构造之后,一切都很好,但是,如果没有它,我会出现错误

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

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

我该如何解决这个问题?提前感谢!如果你需要更多,就去问吧!

EF Core removrange项目未在事务中删除

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

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();
}

这是您的问题,在Entityframework中,您必须在每次执行数据库后写入保存更改。因此,你的功能应该像这个

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();

}