如何处理Entity Framework导航属性CollectionChanged事件?

时间:2017-06-07 12:29:35

标签: c# entity-framework code-first

假设我有这样的实体:

public class Node
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Node Parent { get; set; }

    public virtual ObservableCollection<Node> Nodes { get; set; }

    public Node()
    {
        Nodes = new ObservableCollection<Node>();
        Nodes.CollectionChanged += Nodes_CollectionChanged;
    }

    private void Nodes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        // do something just if the USER adds or romoves item.
    }
}

我的问题是Nodes_CollectionChanged函数在第一次使用EF初始化属性时也被调用,而不仅仅是在用户添加或移动项目时。

我的问题是,只有当用户在列表中添加或删除项目时,我才能回复?

2 个答案:

答案 0 :(得分:1)

当EF将所有项目添加到集合并调用某些方法时,您可以处理ObjectMaterialized事件,您可以在其中订阅:

public Context() 
{
    ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
          (sender, e) => Subscribe(e.Entity as Node);

}
public void Subscribe(Node node)
{
    node?.Subscribe();
}

public class Node
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Node Parent { get; set; }

    public virtual ObservableCollection<Node> Nodes { get; set; }

    public Node()
    {
        Nodes = new ObservableCollection<Node>();
    }

    public void Subscribe()
    {
        Nodes.CollectionChanged += Nodes_CollectionChanged;
    }

    private void Nodes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        // do something just if the USER adds or romoves item.
    }
}

答案 1 :(得分:0)

为了完全避免这个问题,我建议仅将实体用作数据传输对象。单独实施您的业务逻辑,您可以随心所欲地执行任何操作。 NodeModel可以处理您的集合更改,您可以控制其生命周期。只需使用Node实体加载/保存数据。