Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架回滚_C#_Asp.net Mvc_Entity Framework_Transactions_Dbcontext - Fatal编程技术网

C# 实体框架回滚

C# 实体框架回滚,c#,asp.net-mvc,entity-framework,transactions,dbcontext,C#,Asp.net Mvc,Entity Framework,Transactions,Dbcontext,我在使用事务和ASP MVC的entity framework方面遇到了问题,例如,如果在事务期间的某个时候引发了异常,DbContext仍然过时,因为回滚没有将导航集合返回到其原始状态 实体框架版本:6.1 相关型号: public Action { public int Id; public string property; } 主要型号: public Model1 { public int Id; public virtual ICollection<

我在使用事务和ASP MVC的entity framework方面遇到了问题,例如,如果在事务期间的某个时候引发了异常,DbContext仍然过时,因为回滚没有将导航集合返回到其原始状态

实体框架版本:6.1

相关型号:

public Action {
    public int Id;
    public string property;
}
主要型号:

public Model1 {
   public int Id;
   public virtual ICollection<Action> Actions
}
我这样做是为了“清除”实体跟踪器,所以下一次实体框架理论上将使用数据库,但我不确定这是否会导致控制器的其他操作中出现某种问题,这些操作应同时使用:

var entities = (from entity in entityManager.ChangeTracker.Entries() select entity).ToList();
foreach (var item in entities)
{
    item.State = EntityState.Detached;
}
我的问题是,如何确保即使在抛出错误时,DbContext始终更新或返回到以前的状态,或者是否有办法强制重新加载单个模型实例的导航集合

已经尝试过这个:

var entry = context.Entry<Model1>(instance).Collection("Actions");
entry.IsLoaded = false;
entry.Load();
同上:

var entry = context.Entry<Model1>(instance);
entry.Reload();

使用AsNoTracking时,实例具有正确的值,但在连接到上下文之前无法更新或删除,如果已经有具有相同PK的实体,则会引发异常

您可以使用代码事务,而不是数据库事务。以及使用语句来处理dbcontext

using (TransactionScope scope = new TransactionScope())
{
    using (MyDBContext db = new MyDBContext())
    {
       //...
       db.SaveChanges()
    }
       scope.Complete();
    }

    using (MyDBContext db = new MyDBContext())
    {
       //...
       db.SaveChanges()
    }
       scope.Complete();
    }

/* end of adding transaction scope*/
}

不相关但您需要正确关闭事务,或者调用close或wrap,在usingyou write//中只有一个DbContext实例,并且与所有控制器和模型共享,imho,这是最糟糕的模式。您将完成所有数据的存储。范围您上下文:每个查询一个。您可以使用下面的链接进行引用:@tschmit007,您是对的,我试图避免异常“一个实体对象不能被IEntityChangeTracker的多个实例引用”,并且成功了,但在这个过程中,我忘记了实体的缓存Framework@TapanKhimani我查一下,我编写了一个泛型类来包装常用方法update、create和delete,它可以工作,但唯一的问题是缓存这对我来说不起作用。我的服务方法中有一个事务作用域,它调用多个Repo方法。Repo方法打开自己的上下文并调用SaveChanges。我在TrasActionScope中进行了一些检查,但调用Transaction.Current.Rollback和/或scope.Dispose不会执行回滚。这些更改将保留在数据库中。我做错了什么?我想我们需要尝试的是,不管我的答案是什么,使用1,2。。。同一dbcontext的不同实例。最后,当我们使用两种不同的DBContext时会发生什么。所有这些都在交易的内部。
var entry = context.Entry<Model1>(instance);
entry.Reload();
using (TransactionScope scope = new TransactionScope())
{
    using (MyDBContext db = new MyDBContext())
    {
       //...
       db.SaveChanges()
    }
       scope.Complete();
    }

    using (MyDBContext db = new MyDBContext())
    {
       //...
       db.SaveChanges()
    }
       scope.Complete();
    }

/* end of adding transaction scope*/
}