假设我有这样的实体:
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
初始化属性时也被调用,而不仅仅是在用户添加或移动项目时。
我的问题是,只有当用户在列表中添加或删除项目时,我才能回复?
答案 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
实体加载/保存数据。