修改复杂类型 EF6 MVC5 的列表

本文关键字:列表 MVC5 EF6 复杂 类型 修改 | 更新日期: 2023-09-27 18:25:54

假设我有以下内容:

public class Employee
    {
        public int EmployeeID { get; set; }
        public string FirstName { get; set; }
        public virtual List<LastName> LastName { get; set; }
    }
 public class LastName
    {
        public int LastNameID { get; set; }
        public new string Value1 { get; set; }
    }

我有一个索引页面,其中的模型是具有以下内容的员工列表:

@foreach (var item in Model) {
//link to Edit page where I can modify the last names in the list
@Html.ActionLink(item.LastName[someIndex], "Edit", new { id = item.EmployeeID })

在我有的控制器中

public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Employee employee = db.Employees.Find(id);
            if (employee == null)
            {
                return HttpNotFound();
            }
            return View(employee);
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Employee employee)
        {
            if (ModelState.IsValid)
            {
               //EXCEPTION HERE - 
                db.Entry(employee).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(employee);
        }

和这样的编辑视图

@model Testing123.Models.Employee
@{
    ViewBag.Title = "LastName";
}
<h2>Last Names</h2>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @for (int i = 0; i < Model.LastName.Count; i ++)
                {
                    @Html.TextBoxFor(m => m.LastName[i].Value1)
                   //ADDED HIDDEN FOR HERE**** Throwing new exception, see below
                    @Html.HiddenFor(m => m.LastName[i].LastNameID)

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
}

当我提交此编辑表单时,它给了我一个例外:

附加类型为"Testing123.Models.LastName"的实体失败,因为相同类型的另一个实体已具有相同的主键值。使用"附加"方法或将实体的状态设置为"未更改"或"已修改"(如果图形中的任何实体具有冲突的键值(时,可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,请使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改">

这是修改 LastName 复杂类型对象列表的正确方法吗?意思是,如果已经有 4 个姓氏,并且我使用文本框进入此视图,并且每个姓氏都显示在文本框中,并且我更改文本框中的值,这会在表单提交时更新姓氏吗?

编辑

添加 HiddenFor 帮助程序后,我现在在 db.saveChanges 上收到以下异常

存储更新、插入或删除语句影响了意外的行数 (0(。自加载实体以来,实体可能已被修改或删除。刷新对象状态管理器条目。

修改复杂类型 EF6 MVC5 的列表

查看异常来自何处(即堆栈跟踪(会很有用,但如果没有,我会指出一些事情。

  1. "编辑"操作中,在已使用它获取 LastName 属性后,检查employee是否为 null。
  2. "编辑"视图没有(或在编辑之前没有(提供任何机制来将其生成的文本框链接回模型。您应该使用Html.TextBoxFor而不是Html.TextBox。此外,您还需要在Html.HiddenFor(m => m.LastName[i].LastNameId)中引用LastNameId(显然在循环内部(,并在Html.HiddenFor条目(循环外部(中引用EmployeeIdFirstName,以便在员工回发时,其上的所有属性及其子集合都将被轮回服务器。
  3. LastName(类型(不是复杂类型,因为它没有 [ComplexType] 属性,并且它确实具有将推断为表的主键的列。但是,复杂类型和普通 EF 实体之间的这种区别对于回答此问题可能并不重要。有关详细信息,请查看本文。