2010-09-13 14 views
1

Je fais des tests avec EF et j'essayais d'obtenir un crochet sur le ObjectContext.SavingChanges. Tout fonctionne quand j'ajoute des objets directement à leur ensemble dans le contexte. Mais lorsque je les ajoute via une propriété d'entité de navigation, ils n'apparaissent pas dans l'événement.Entity Framework SaveChanges problème

Je vais montrer un exemple pour le rendre plus clair. Cette méthode est enregistrée dans l'événement SavingChanges.

void SavingChanges(object sender, System.EventArgs e) 
{ var oc = (ObjectContext)sender; 
    foreach (var entity in oc.ObjectStateManager 
     .GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Unchanged | EntityState.Modified)) 
     Debug.WriteLine(entity); 

} 

Et c'est ainsi que j'ajoute des choses au contexte.

var w1 = new Workspace() 
      { 
       Name = "teste1", 
      }; 

var w2 = new Workspace() 
      { 
       Name = "teste2" 
      }; 

var w3 = new Workspace() 
      { 
       Name = "teste3" 
      }; 

var w4 = new Workspace() 
      { 
       Name = "teste4" 
      }; 

//this shows up in the event 
context.Workspaces.Add(w1); 

//these do NOT show up on the event 
w1.Children.Add(w2); 
w1.Children.Add(w3); 
w1.Children.Add(w4); 

context.SaveChanges(); 

Y at-il un moyen que je puisse obtenir toutes les entités qui ont été ajoutées lorsque le SaveChanges est appelé? Ils sont persistants dans ma base de données, donc je veux savoir quand ça arrive.

Merci!

edit: J'utilise EF4 avec CTP4.

edit2: Ceci est mon POCO.

public class Workspace 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 

    public virtual ICollection<Workspace> Children{ get;set;} 

    public virtual Workspace Parent { get; set; } 
} 
+2

Je l'ai essayé et il retourne tous les objets y compris ceux de la collection Children. Quelle version EF utilisez-vous? –

+0

J'ai modifié la question avec cette information. – codegarten

+0

Utilisez-vous des STE? –

Répondre

0

Ok, donc le problème était dans le manque de suivi des modifications. J'essayais d'utiliser des proxies pour faire exactement cela, mais il s'avère que le 'nouvel' opérateur ne crée aucun type de proxy, donc aucun suivi n'est fait aux objets et rien d'ajouté à eux n'est ajouté au contexte.

Pour créer un proxy, j'ai dû appeler ObjectContext.CreateObject. Étant donné que j'utilisais DbContext, les solutions consistaient soit à exposer le ObjectContext interne, soit à créer une méthode qui appelait le contexte en interne. Je suis allé pour le dernier.

Mais cela semble un hack. Avez-vous des suggestions pour une solution plus élégante? Edit: Bien que cela fonctionne, il est possible de s'en tenir uniquement à l'API DbContext. Cela est effectué en utilisant des POCO non proxy et en appelant DetectChanges avant que l'événement SavingChanges ne soit déclenché.