WPF/MVVM/EF — как привязаться к связанным сущностям объекта?

У меня есть подробное представление, соответствующее пользовательскому объекту. Каждый пользовательский объект имеет один или несколько объектов комментариев, которые представлены в подробном представлении в виде сетки.

Подробный вид с сеткой

Таким образом, следуя соглашению EF, пользовательская модель имеет член UserComments для представления отношения:

public partial class User
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<UserComments> UserComments { get; set; }
    //....
}

Когда пришло время создать сетку комментариев пользователя в представлении сведений о пользователе, я понял, что сетка неправильно привязывается к ICollection (не удалось добавить новые строки в сетку). Немного покопавшись, я обнаружил, что мне нужно использовать ObservervableColletion. Итак, я преобразовал свою ICollection в ObserverableCollection....

public class UserDetailViewModel
{

    public virtual User UserData { get; set; }  
    private ObservableCollection<UserComments> _UserComments;   

    public ObservableCollection<UserComment> UserComments {
        get { return _UserComments; }
    }

    public void Load(int UserID)
    {
        this.UserData = UserRepo.Find(UserID);      
        this._UserComments = new ObservableCollection<UserComment>(UserData.UserComments);
    }

}

Прохладно. Теперь я могу добавлять строки в сетку. Но...

На данный момент я понял, что потерял отслеживание изменений EF, преобразовав User.UserComments в ObservableCollection, и у меня нет простого способа вернуть измененные/новые комментарии обратно в EF.

Итак, я подошел ко всему этому неправильно? Есть ли лучший способ обновления связанных данных?


person voon    schedule 17.09.2015    source источник


Ответы (1)


Чтобы EF мог отслеживать изменения в коллекции, необходимо добавлять и удалять из коллекции в самой модели.

this._UserComments = new ObservableCollection<UserComment>(UserData.UserComments);

В приведенной выше строке вы создаете коллекцию с помощью копирование элементов, поэтому когда элементы добавляются или удаляются из UserDetailViewModel.UserComments, эти элементы фактически не добавляются и не удаляются из User.UserComments.


Некоторые варианты исправления этого включают в себя:

  • Изменение самого User.UserComments на ObservableCollection и предоставление его в модели представления. Например:

    public class UserDetailViewModel
    {
        public virtual User UserData { get; set; }     
    
        public ObservableCollection<UserComment> UserComments 
        {
            get { return UserData.UserComments; }
        }
    
        // other stuff...
    }
    
  • Обработка событий добавления/удаления для UserDetailViewModel.UserComments и изменение там коллекции User.UserComments.

Это также может быть полезно: https://msdn.microsoft.com/en-us/data/jj574514.aspx

person jjj    schedule 17.09.2015
comment
Спасибо. Я не знал, что использование ObserverableCollection (вместо ICollection) совместимо с инфраструктурой сущностей. Я думаю, я должен был посмотреть это. - person voon; 18.09.2015
comment
Мне пришлось сделать явное приведение типов... как вы ожидаете, что класс Model будет выглядеть? - person FizxMike; 16.12.2017