2017-06-07 2 views
1

Disons que je l'entité comme ceci:Comment gérer la propriété de navigation Entity Framework event CollectionChanged?

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. 
    } 
} 

Mon problème est que la fonction Nodes_CollectionChanged est également appelée lorsque EF initialise la propriété pour la première utilisation, et non seulement lorsque l'utilisateur ajoute ou romoves un élément.

Ma question est comment puis-je répondre uniquement lorsque l'utilisateur ajoute ou supprime un élément de la liste?

Répondre

0

Pour éviter complètement le problème, je recommande d'utiliser des entités uniquement comme objets de transport de données. Mettez en œuvre votre logique métier séparément et vous êtes libre de faire tout ce que vous voulez. Un NodeModel peut gérer vos modifications de collection et vous pouvez contrôler son cycle de vie. Utilisez simplement l'entité Node pour charger/enregistrer les données.

1

Vous pouvez gérer l'événement ObjectMaterialized, lorsque EF a ajouté tous les articles à des collections et appeler une méthode, vous pouvez vous inscrire

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. 
    } 
} 
+0

'ObjectMaterialized' se produit avant la' Nodes' se remplit. Les «noeuds» se remplissent lors de la première utilisation. comment puis-je savoir que 'Nodes' est déjà plein? – magicode

+0

@magicode Oui, j'ai vérifié - l'événement a été déclenché après qu'un élément de la collection enfant a été ajouté, c'est étrange. Avez-vous trouvé une solution? – Backs