Добавление к EntityCollection добавляет к концу коллекции в Entity Framework?

голоса
2

Я пытаюсь иметь вид, где пользователь может добавлять элементы в коллекции без необходимости идти к новому View (сценарий является своим родом сайта CV, где пользователь добавляет информацию об опыте работы, навыках и т.д., и это было бы кажется абсурдным, чтобы перейти к новому View, чтобы добавить каждую мелочь).

Поэтому у меня есть редактируемый вид, который показывает количество текстовых полей для уже добавленных элементов, и есть более Аякс призыв идти к способу извлечения сбора свежего, если пользователь добавляет элемент.

Вот методы в вопросе:

    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 называется, он добавляет новую программу к объекту консультанта и создает новый ViewModel отправить обратно, но он добавляет новую программу в начало EntityCollection, а не в конце. Но тогда, когда вы размещаете всю форму, и вы снова открыть Edit View, список будет помещена новой добавленной программа в конце. Это очень странно. Пользователь будет думать, что он / она добавляет элемент в начале списка, но если они вернуться на страницу снова, они найдут новый пункт в конце.

Почему он это делает, и есть ли способ, что я могу сделать NewProgram () есть новая программа добавлена ​​в конце напрямую?

И если кто - то думает « он должен быть с помощью ViewModel» с DTOS вместо того чтобы работать непосредственно с объектами EF, хорошо, я был по этому пути довольно долгое время теперь ( Entity Framework и MVC 3: Отношения не могут быть изменены потому что один или несколько внешних ключей свойств не является обнуляемым ), и до сих пор никто не показал мне явно , как добиться этого и все еще быть в состоянии как добавлять и удалять элементы в том же View. Существует либо проблема с сохранением индексов коллекций или Entity Framework не позволит мне сохранить ... А код стал кошмаром.

Таким образом, я по крайней мере, понятного кода, и единственное, что мне нужно, что это добавление сделано в «нормальном» порядке, то есть добавить в конец коллекции ...

Есть идеи?

КСТАТИ:

Это работает, но это, кажется, очень ненужно сначала нужно добавить новую программу к объекту консультанта, создать 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);
    }
Задан 28/02/2011 в 21:14
источник пользователем
На других языках...                            


1 ответов

голоса
1

Согласно http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx , навигационная свойство Programsпереопределяется для вызова какой - то DoLazyLoad()метод. Так как сам экземпляр свойства не necessarly изменилось,DoLazyLoad() может на самом деле асинхронным, которые могли бы объяснить поведение вы заметили.

Так как вы , так или иначе оценивать список, вы могли бы назвать , ToList()прежде чем добавить новую программу. Это может потребовать от вас изменить только линии немного:

consultant.Programs.ToList().Add(new Program());

Если это не сработает, попробуйте:

consultant.Programs.ToList();
consultant.Programs.Add(new Program());

Это на самом деле не очень хорошо работает с моей «асинхронной» теорией, но может помочь вам.

Ответил 28/02/2011 в 21:28
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more