Должны ли дочерние объекты автоматически обновляться в Entity Framework 4 Code-First? - PullRequest
0 голосов
/ 05 марта 2012

У меня есть объект Venue:

public class Venue
{
    public int Id { get; set; }

    [Required]
    [MaxLength(512)]
    public string Name { get; set; }

    public string Description { get; set; }

    [Required]
    [Display(Name = "Venue Type")]
    public int VenueTypeId { get; set; }
    public virtual VenueType VenueType { get; set; }

    [Required]
    [Display(Name = "Company")]
    public int CompanyId { get; set; }
    public virtual Company Company { get; set; }

    public virtual ICollection<VenuePart> VenueParts { get; set; }
}

Как видите, у него есть коллекция VenuePart с.Я отправляю Venue в представление и выводю коллекцию VenuePart s в виде таблицы текстовых полей.Это отправляется обратно на Edit(VenueDetailsViewModel venueDetailsViewModel).Используя отладчик, я могу убедиться, что мои изменения находятся в коллекции VenuePart s, поэтому я думаю, что у нас все хорошо с привязкой.

Мой контроллер пытается обновить Venue.Он преуспевает в свойствах непосредственно на объекте, таких как Name.Но, если я не перебираю коллекцию, она не обновляет эти объекты.Это типичное поведение?

unitOfWork.VenueRepository.Update(venueDetailsViewModel.Venue);
// Should this loop be necessary?
foreach (var venuePart in venueDetailsViewModel.Venue.VenueParts)
{
    unitOfWork.VenuePartRepository.Update(venuePart);
}
unitOfWork.Save();

В данный момент я даже не беспокоюсь о том, чтобы обрабатывать что-то новое в списке или что-то, что исчезло из списка (хотя это то, что я решу дальше).Для моего первого шага я просто хочу обновить список.Необходимо ли циклически проходить через коллекцию и обновлять каждый отдельный объект?Если я этого не сделаю, они не спасут.Но похоже, что они должны без моей петли.Мои ожидания слишком высоки или я что-то не так делаю?

Мои repository и unitOfWork объекты созданы по шаблону после этого урока , если вам интересно, как выглядит этот код.

1 Ответ

1 голос
/ 05 марта 2012

Это потому, что unitOfWork.VenueRepository.Update(venueDetailsViewModel.Venue); прикрепит граф объектов в состоянии Unchanged и изменит только venue на Modified. Один из вариантов - переместить цикл foreach на метод VenuePartRepository.Update.

Если вы разрешите добавление или удаление элементов VenueParts из пользовательского интерфейса, вам будет сложно применить изменения. Если это так, вам придется загрузить коллекцию в базу данных и сравнить ее с поступающими изменениями. Затем вручную измените состояния VenuePart на Added или Deleted.

...