0

我有一个与用户实体相对应的详细视图。每个用户实体都有一个或多个评论实体,在详细视图上以网格表示。

带网格的详细视图

所以遵循 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);
    }

}

凉爽的。我现在可以将行添加到网格中。但...

在这一点上,我意识到我已经通过将 User.UserComments 转换为 ObservableCollection 丢失了 EF 更改跟踪,并且没有简单的方法将修改后的/新的评论返回到 EF 中。

那么我是不是把这一切都搞错了?有没有更好的方法来更新相关数据?

4

1 回答 1

3

为了让 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

于 2015-09-17T20:29:14.083 回答