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

时间:2016-07-28 17:36:04

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

这是我的问题

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(),一切都很好,但是,没有它,我有错误

  

实体类型的实例&#39;用户&#39;无法跟踪,因为   另一个具有相同密钥的此类实例已经存在   跟踪。添加新实体时,对于大多数键类型都是唯一的   如果没有设置密钥,则将创建临时密钥值(即,如果密钥   属性被指定为其类型的默认值)。如果你是   明确设置新实体的关键值,确保不这样做   与现有实体或为其他实体生成的临时值发生冲突   新实体。附加现有实体时,请确保只有一个实体   具有给定键值的实体实例附加到上下文。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

这是您的问题,在实体框架中,您必须在每次执行数据库之后编写保存更改。因此,您的函数应如下所示:

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

}