gpt4 book ai didi

c# - EntityState.Modified 是否会导致执行插入操作

转载 作者:行者123 更新时间:2023-11-30 16:56:32 25 4
gpt4 key购买 nike

我正在阅读以下有关 Entity Framework 6 的教程 Link .在名为“为教师添加编辑页面”的部分中,作者在 Post edit 操作方法中编写了以下代码:-

[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public ActionResult EditPost(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var instructorToUpdate = db.Instructors
.Include(i => i.OfficeAssignment)
.Where(i => i.ID == id)
.Single();

if (TryUpdateModel(instructorToUpdate, "",
new string[] { "LastName", "FirstMidName", "HireDate", "OfficeAssignment" }))
{
try
{
if (String.IsNullOrWhiteSpace(instructorToUpdate.OfficeAssignment.Location))
{
instructorToUpdate.OfficeAssignment = null;
}

db.Entry(instructorToUpdate).State = EntityState.Modified;
db.SaveChanges();

return RedirectToAction("Index");
}
catch (RetryLimitExceededException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
}
return View(instructorToUpdate);
}

此代码将涵盖这三个条件:-

  • 如果用户清除了 office assignment 并且它最初有一个值,则您必须移除并删除 OfficeAssignment 实体。
  • 如果用户输入了办公室分配值,而该值最初为空,则您必须创建一个新的 OfficeAssignment 实体。
  • 如果用户更改办公室分配的值,您必须更改现有 OfficeAssignment 实体中的值。

那么这是否意味着

db.Entry(instructorToUpdate).State = EntityState.Modified;

如果 Instructor 没有 prevouse OfficeAssignment 对象,是否会导致对 OfficeAssignment 记录执行插入语句?管理它的规则是什么?

这是完整的模型图:- enter image description here

最佳答案

DbContext.Entry 方法用于执行显式加载,这意味着它使您可以访问 DbContext 拥有的关于实体的所有信息。这超出了存储在实际实体属性中的值,包括诸如实体状态和从数据库中检索每个属性时的原始值等内容。

当您调用 TryUpdateModel方法,它将使用模型联编程序中的值更新属性(您将它们的名称作为参数传递)。其中一个属性是 OfficeAssignment,它也已更新。如果在您看来您没有输入 Location,那么您就没有理由创建新的 OfficeAssigment(这就是您需要执行 instructorToUpdate 的方式。 OfficeAssignment = null; 因为即使您没有输入新的 Location,您也会有一个 OfficeAssignment 的实例。如果您添加一个新的 Location,您将创建一个新的 OfficeAssignment,如果您修改了 Location,那么您将修改它的值(value)。当您这样做时:

db.Entry(instructorToUpdate).State = EntityState.Modified;

您将在实体上设置一个标志,指示它已被更改。当调用 SaveChanges 方法时,Modified 标志会导致 Entity Framework 创建 SQL 语句来更新数据库行。数据库行的所有列都将更新,包括用户未更改的列,并发冲突将被忽略。为了更好地理解发生了什么,您可以将 Instructor 实例看成一棵树。 Code First 认识到您具有导航属性,因此需要对其进行更新或插入(视情况而定)。如果 OfficeAssignmentIddefault(int) 不同(我认为这是一个整数),那么它将被更新, 在其他情况下,它将被插入。

关于c# - EntityState.Modified 是否会导致执行插入操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com