添加到EntityCollection会在Entity Framework中添加到集合的末尾吗?

时间:2011-02-28 22:14:37

标签: asp.net-mvc entity-framework entitycollection

我正在尝试使用View,用户可以在集合中添加项目而无需转到新视图(该场景是一种CV网站,用户可以在其中添加有关工作经验,技能等的信息,并且去一个新的视图添加每个小东西似乎很荒谬。

所以我有一个编辑视图,显示已经添加的项目的许多文本框,并且有一个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()直接在最后添加新程序?

如果有人在考虑“他应该使用ViewModel”而不是直接使用EF对象,那么,我已经走了很长一段时间了(Entity Framework and MVC 3: The relationship could not be changed because one or more of the foreign-key properties is non-nullable),所以远没有人明确告诉我如何实现这一点,仍然能够在同一个视图中添加和删除项目。维护集合的索引存在问题,或者实体框架不会让我保存...而且代码变成了一场噩梦。

这样我至少可以理解代码,唯一的问题是我需要以“正常”顺序完成此添加,即在集合的末尾添加...

有什么想法吗?

顺便说一句:

这很有效,但首先必须将新程序添加到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);
    }

1 个答案:

答案 0 :(得分:1)

根据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());

这实际上不适合我的“异步”理论,但可能会帮助你。