假设我有以下内容:
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)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。
答案 0 :(得分:1)
查看异常的来源(即堆栈跟踪)会很有用,但如果没有,我会指出一些事情。
employee
属性获取LastName
属性后,检查Html.TextBox
是否为空。Html.TextBoxFor
而不是LastNameId
。此外,您需要在Html.HiddenFor(m => m.LastName[i].LastNameId)
(显然在循环内)和EmployeeId
条目中的FirstName
和Html.HiddenFor
中引用LastName
(在循环外部) )这样当员工被回发时,其上的所有属性及其子集合都会往返于服务器。[ComplexType]
(类型)不是复杂类型,因为它没有{{1}}属性,并且它确实有一个列将被推断为表的主键。但是,复杂类型和普通EF实体之间的区别对于回答这个问题可能并不重要。有关详细信息,请查看this article。