我使用MVC 5與實體框架代碼優先。MVC中的UpdateModel創建子列表的重複/孤立記錄
我有一個班級(學校班級)有一個學生名單附加到它的對象,我試圖更新班級和/或學生在課堂上,當我在上下文中調用SaveChanges()
時,我得到的是班級中學生的重複記錄。基本上,舊的學生列表在數據庫中「孤兒」,並且全新的一組學生被附加到數據庫中的編輯班級。
因此,而不是10在數據庫中糾正學生的記錄,我現在有20個學生記錄。 10個原始(未糾正)和10個新(糾正)的。原有的10個外鍵被刪除,因此它們不再是該類的一部分。
Class對象的任何更新,而無需複製類記錄實施罰款。
我見過一個回答表明,也許上下文不知道學生是不是新的項目,因此它增加了他們......並抓住從數據庫中的學生,讓上下文知道他們 - 但如果學生從數據庫中提取類對象時出現,是不是像直接拉動類似的東西一樣?
public class Class
{
[Key]
public Guid ClassId { get; set; }
[Display(Name="Class Name")]
public string ClassName { get; set; }
public virtual List<Student> Students { get; set; }
public virtual Teacher Teacher { get; set; }
public Class()
{
ClassId = Guid.NewGuid();
Students = new List<Student>();
}
}
[HttpPost]
public ActionResult Edit(Guid id, FormCollection collection)
{
Class selectedclass = db.Classes.Find(id);
try
{
UpdateModel(selectedclass, collection.ToValueProvider());
db.SaveChanges();
return RedirectToAction("Details", new { id = id });
}
catch
{
return View(selectedclass);
}
}
我在做什麼錯了?
,我能想到的唯一要做的是去除附加到該類之前我保存更改數據庫中所有學生的記錄,但必須有比這更好的方式。
db.Students.RemoveRange(db.Classes.Find(id).Students);
所以,我試圖連接的學生名單範圍內,甚至改變他們的狀態來修改,如:
selectedclass.Students.ForEach(s => db.Students.Attach(s));
selectedclass.Students.ForEach(s => db.Entry(s).State = EntityState.Modified);
,但沒有運氣,仍然得到重複和孤兒。
試圖直接從數據庫中獲取的學生,但沒有運氣:
var ids = selectedclass.Students.Select(s => s.StudentId).ToList();
selectedclass.Students = db.Students.Where(s => ids.Contains(s.StudentId)).ToList()
的HTML編輯器爲學生:
@for (int i = 0; i < Model.Students.Count; i++)
{
<div class="col-md-8">
@Html.EditorFor(m => m.Students[i], new { htmlAttributes = new { @class = "form-control" }})
</div>
}
編輯模板學生:
<div class="form-group">
@Html.LabelFor(m => m.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-xs-6 col-md-4">
@Html.EditorFor(m => m.FirstName, new { htmlAttributes = new { @class = "form-control" }})
</div>
@Html.LabelFor(m => m.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-xs-6 col-md-4">
@Html.EditorFor(m => m.LastName, new { htmlAttributes = new { @class = "form-control" }})
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.UserName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-xs-6 col-md-4">
@Html.EditorFor(m => m.UserName, new { htmlAttributes = new { @class = "form-control" } })
</div>
@Html.LabelFor(m => m.Password, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-xs-6 col-md-4">
@Html.EditorFor(m => m.Password, new { htmlAttributes = new { @class = "form-control" }})
</div>
</div>
在使用'UpdateModel()'之前和之後檢查'selectedclass'的值# –
@StephenMuecke它們從原來的狀態改變爲我希望它們更新的狀態...沒有問題。它只是將新列表添加到數據庫中,而不是更新現有的學生列表,而是將其添加到數據庫中。 –
但你在你的問題中指出ClassId屬性被刪除? –