2009-02-26 4 views
36

Je crée une application avec ADO.NET Entity Framework.Comment puis-je voir les modifications en attente de Entity Framework?

Je peux parcourir mon code ligne par ligne pendant le débogage et regarder SQL Server Profiler pour chaque requête exécutée, mais je n'arrive pas à comprendre d'où proviennent toutes ces commandes SQL! Parfois, lorsque j'exécute SaveChanges(), Entity Framework effectue des INSERTS inattendus et étranges. Ils cassent parfois l'application. Je ne peux pas comprendre ce que je fais pour les provoquer.

Comment puis-je surveiller les modifications en attente qui attendent l'appel SaveChanges()?

Répondre

20

Jetez un oeil à

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here.

+9

Si vous utilisez un objet DbContext alors vous aurez besoin de jeter un IObjectContextAdapter avant de pouvoir accéder au ObjectStateManager. Exemple: ((IObjectContextAdapter) dbcontext) .ObjectContext.ObjectStateManager – Corin

8

Pour surveiller les événements lorsque les entités sont ajoutés ou supprimés du gestionnaire d'état, vous pouvez utiliser l'événement ObjectStateManagerChanged:

var ctx = new ModelContainer(); 

// ... 

ctx.ObjectStateManager.ObjectStateManagerChanged += (sender, e) => 
{ 
    Trace.WriteLine(string.Format("{0}, {1}", e.Action, e.Element)); 
}; 
36

Depuis Entity Framework 5.0 DbContext a une ChangeTracker property qui a toutes les modifications en attente. Semblable à la ObjectStateManager vous pouvez obtenir des entités dans différents états comme suit:

myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Added); 
myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted); 
myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified); 
+3

Merci, on dirait que c'est la seule bonne réponse pour EF5 + – Peter

+0

Je n'arrive pas à accéder à cela dans les fenêtres immédiates! Je reçois [cette erreur] (http://imgur.com/a/2CsQn). – Ciwan

+0

Bon, y a-t-il un moyen d'obtenir le SQL qu'EF va essayer de faire pour ces changements? –

2

Entity Framework 6 a une méthode pour cela, vraiment utile.

dbContext.ChangeTracker.HasChanges() 

Exemple:

if (dbContext.ChangeTracker.HasChanges()) 
{ 
    db.SaveChanges(); 
} 
Questions connexes