EF Core removerange items not removed on transaction

眉间皱痕 提交于 2019-12-12 03:38:50

问题


Here's my prblem

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

If i will add db.SaveChanges() after the RemoveRange() istruction, everything is fine, but, without that, i have the error

The instance of entity type 'Users' cannot be tracked because another instance of this type with the same key is already being tracked. When adding new entities, for most key types a unique temporary key value will be created if no key is set (i.e. if the key property is assigned the default value for its type). If you are explicitly setting key values for new entities, ensure they do not collide with existing entities or temporary values generated for other new entities. When attaching existing entities, ensure that only one entity instance with a given key value is attached to the context.

I would like to avoid saving after the removerange, because i won't have empty tables if the transaction fails.

How can i solve this? Thanks in advance! If you need more just ask!


回答1:


Not sure about this error, but you could try using an explicit transaction:

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



回答2:


Here is your problem, in Entityframework you have to write savechange after each database execution. Hence, your function should look like this

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

}



来源:https://stackoverflow.com/questions/38643184/ef-core-removerange-items-not-removed-on-transaction

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!