【发布时间】:2018-08-07 04:21:06
【问题描述】:
我在尝试更新我的编辑操作中的上下文时遇到了一个问题:
[HttpPost]
public IActionResult Edit(Model.LeaveApplication leaveApplication) {
ViewBag.Title = "Edit Leave Application";
ViewBag.leavePeriodList = context.LeavePeriod.ToList();
ViewBag.LeaveTypeList = context.LeaveType.ToList();
try {
if (ModelState.IsValid) {
if (!validateDateRanges(leaveApplication, "edit")) {
return View(leaveApplication);
}
leaveApplication.NumDays = (float)CalculateNoOfDays(leaveApplication);
context.LeaveApplication.Update(leaveApplication);
context.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DbUpdateException) {
ModelState.AddModelError("", "Unable to edit leave application. " +
"Please try again, and if the problem persists, " +
"please see your system administrator.");
}
return View(leaveApplication);
}
我要做的是检查是否有超过 1 条记录以验证日期范围。如果只有 1 条记录,我将跳过验证并继续更新上下文。但是,我收到一条错误消息:
无法跟踪实体类型“LeaveApplication”的实例,因为已在跟踪具有相同键的该类型的另一个实例。
是什么导致了这个问题?
这是我的构造函数代码:
public class LeaveApplicationController : Controller {
LeaveDBContext context;
private readonly UserManager<ApplicationUser> userManager;
private readonly SignInManager<ApplicationUser> signInManager;
public LeaveApplicationController(LeaveDBContext context, UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager) {
this.context = context;
this.userManager = userManager;
this.signInManager = signInManager;
}
}
【问题讨论】:
-
除了 上下文 之外还有其他 DbContext 实例吗?当我尝试通过两个上下文实例到达同一个实体对象时,它发生在我身上。如果这是问题所在,您应该使用单个上下文或在使用其他上下文到达它后取消跟踪
-
不,我认为我没有任何其他 DbContext 实例,但我确实有一个 UserDbContext。在我的构造函数中,我包含了参数
LeaveDbContext、UserManager<ApplicationUser和SignInManager<ApplicationUser>。 -
你能发布你的构造函数代码吗?
-
@PavelLevchuk 好的,我已经更新了我的问题以包含构造函数代码
-
@iamhx,您可能使用 UserDbContext 访问同一实体。您可以通过分离实体来取消跟踪它; context.Entry(leaveApplication).State = EntityState.Detached;
标签: asp.net-mvc entity-framework asp.net-core