[英]Adding to EntityCollection adds to the end of collection in Entity Framework?
我正在嘗試創建一個視圖,用戶可以在其中添加項而不必轉到新視圖(該場景是一種CV網站,用戶可以在其中添加有關工作經驗,技能等的信息,該視圖去一個新的視圖添加每個小東西似乎很荒謬)。
因此,我有一個Edit View,該視圖顯示了一些已添加項目的文本框,並且有一個ajax調用,可以轉到一種方法來在用戶添加項目時獲取最新的集合。
這里是有問題的方法:
public ActionResult Edit(int id)
{
Consultant consultant = _repository.GetConsultant(id);
var vm = GetViewModel(consultant);
return View(vm);
}
private DetailsViewModel GetViewModel(Consultant consultant)
{
return new DetailsViewModel
{
Programs = consultant.Programs.ToList(),
Consultant = consultant
};
}
public ActionResult NewProgram(int id)
{
//TODO: ordering is rather strange, because the entitycollection adds at the beginning rather than the end...
Consultant consultant = _repository.GetConsultant(id);
consultant.Programs.Add(new Program());
_repository.Save();
var vm = GetViewModel(consultant);
return PartialView("ProgramList", vm);
}
現在要解決的問題是:調用NewProgram方法時,它將新程序添加到Consultant對象中,並創建一個新的ViewModel發送回去,但是它將新程序添加到EntityCollection的開始而不是末尾。 但是,當您發布整個表單時,再次打開“編輯視圖”時,該列表會將新添加的程序放在最后。 這很奇怪。 用戶會認為他/她在列表的開頭添加了一個項目,但是如果他們再次返回頁面,他們將在末尾找到新的項目。
為什么要這樣做,有什么辦法可以使NewProgram()在末尾直接添加新程序?
而且,如果有人認為“應該使用帶有DTO的ViewModel”而不是直接使用EF對象,那么,我已經走了很長一段時間( 實體框架和MVC 3:關系無法更改因為一個或多個外鍵屬性是不可為null的 ),到目前為止,沒有人向我明確顯示如何實現此目的,並且仍然能夠在同一View中添加和刪除項。 維護集合的索引存在問題,或者實體框架不會讓我省錢……而代碼成了噩夢。
這樣,我至少具有可理解的代碼,並且唯一的事情是我需要按“正常”順序進行此添加,即在集合的末尾添加...
有任何想法嗎?
BTW:
這行得通,但是似乎沒有必要先將新程序添加到Consultant對象,創建沒有新程序的ViewModel,然后將其分別添加到ViewModel ...
public ActionResult NewProgram(int id)
{
//TODO: ordering is rather strange, because the entitycollection adds at the beginning rather than the end...
Consultant consultant = _repository.GetConsultant(id);
var vm = GetViewModel(consultant);
var program = new Program();
consultant.Programs.Add(program);
_repository.Save();
vm.Programs.Add(program);
return PartialView("ProgramList", vm);
}
根據http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx ,您的導航屬性Programs
被覆蓋,可以調用某種DoLazyLoad()
方法。 由於不需要更改屬性實例本身,因此DoLazyLoad()
實際上可能是異步的,這可以解釋您注意到的行為。
由於您正在評估列表,因此可以在添加新程序之前調用ToList()
。 它只需要您稍微更改一下行即可:
consultant.Programs.ToList().Add(new Program());
如果這不起作用,請嘗試:
consultant.Programs.ToList();
consultant.Programs.Add(new Program());
這實際上不適用於我的“異步”理論,但可能會對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.