c# - 拒绝更改后的 Entity Framework Core dbContext 行为
问题描述
我有一个带有实体框架的 C# .NET Core API 项目。在其中一个 API 中,有一种特殊情况,我需要中止我在数据库上下文中所做的更改,然后将其他不同的数据保存在我的数据库中。
我找到并编辑了一些代码来做到这一点:
public void RejectChanges()
{
var ChangeTracker = new Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker(_context);
foreach (var entry in ChangeTracker.Entries())
{
switch (entry.State)
{
case EntityState.Modified:
case EntityState.Deleted:
entry.State = EntityState.Modified; //Revert changes made to deleted entity.
entry.State = EntityState.Unchanged;
break;
case EntityState.Added:
entry.State = EntityState.Detached;
break;
}
}
}
它似乎有效,但我有一个很大的疑问:如果另一个 API 要保存自己的数据,这个操作是否也会影响它的数据,也拒绝那些更改?或者,如我所愿,它是否只影响调用此方法的 API 会话?
示例:API 1 在上下文中编辑一些数据,然后调用该RejectChanges
方法。同时,API 2 编辑其他数据并保存。从 API 1 调用的 ,是否RejectChanges
也拒绝 API 2 所做的编辑?
解决方案
The Change Tracker is scoped to a single DbContext, which should be scoped to a single API request. Also you don't create a new ChangeTracker. The DbContext already has one.
var ChangeTracker = _context.ChangeTracker;
Also changing the Entry.State doesn't "revert" any changes. It just changes what action EF will take on SaveChanges().
推荐阅读
- mysql - MySQL8.20中服务器请求客户端未知的身份验证方法
- python - 根据另一列值删除字符串中的单词
- azure-functions - 如何解决 Alexa 问题请求的技能响应?
- c++ - 在声明的同一行从 lambda 返回值
- reactjs - React ref.current 内部循环仅在第一次迭代时起作用
- python - 如何根据列唯一集将行保留在 DataFrame 中?
- typescript - 如何在 Typescript 中指定数字的最小-最大范围?
- css - 我无法以角度设置身体背景图像
- python - Tkinter 透明框架文本未显示
- javascript - 如何根据内容中的过滤器编号隐藏表格?