簡體   English   中英

添加到EntityCollection會添加到Entity Framework中集合的末尾嗎?

[英]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.

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