簡體   English   中英

修改復雜類型EF6 MVC5的列表

[英]modifying List of complex types EF6 MVC5

假設我有以下內容:

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條目。

查看異常的來源(即堆棧跟蹤)會很有用,但是在沒有異常的情況下,我需要指出一些事情。

  1. 在“編輯”操作中,您已經使用employee來獲取LastName屬性,然后檢查employee是否為null。
  2. “編輯”視圖不提供(或在編輯之前未提供)將其生成的文本框鏈接回模型的任何機制。 您應該使用Html.TextBoxFor而不是Html.TextBox 另外,您還需要在Html.HiddenFor(m => m.LastName[i].LastNameId) (顯然在循環內部Html.HiddenFor(m => m.LastName[i].LastNameId)引用LastNameId ,並在Html.HiddenFor條目(在循環外部)中Html.HiddenFor EmployeeIdFirstName 。將員工發回時,其上的所有屬性及其子集合都將往返於服務器。
  3. LastName (類型)不是復雜的類型,因為它沒有[ComplexType]屬性,並且確實具有將被推斷為表的主鍵的列。 但是,復雜類型和普通EF實體之間的區別對於回答這個問題可能並不重要。 請查看本文以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM