2009-02-26 20 views
36

我正在用ADO.NET实体框架创建一个应用程序。如何查看实体框架的未决更改?

我可以一行一行通过我的代码,一边调试,一边观察执行的每个查询的SQL Server Profiler,但我无法弄清楚所有这些SQL命令来自哪里!

有时当我执行SaveChanges()时,实体框架会执行意外的怪异插入。他们有时会破坏应用程序。我无法弄清楚我在做什么来造成他们。

如何监控等待SaveChanges()调用的排队等待更改?

回答

20

看看

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 

here

+9

如果您正在使用的DbContext对象,那么你就需要将其转换为IObjectContextAdapter,然后才能访问ObjectStateManager。示例:(((IObjectContextAdapter)dbcontext).ObjectContext.ObjectStateManager – Corin 2012-10-22 21:13:44

8

要监控的事件时,实体添加或删除从状态管理器,你可以使用ObjectStateManagerChanged事件:

var ctx = new ModelContainer(); 

// ... 

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

由于实体框架5.0 DbContextChangeTracker property拥有所有未决的改变。类似于ObjectStateManager你可以在各种状态下的实体如下:

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

谢谢,看起来这是唯一正确的答案EF5 + – Peter 2014-09-02 06:55:10

2

实体框架6有一个方法,真正有用的。

dbContext.ChangeTracker.HasChanges() 

例子:

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