我正在用ADO.NET实体框架创建一个应用程序。如何查看实体框架的未决更改?
我可以一行一行通过我的代码,一边调试,一边观察执行的每个查询的SQL Server Profiler,但我无法弄清楚所有这些SQL命令来自哪里!
有时当我执行SaveChanges()
时,实体框架会执行意外的怪异插入。他们有时会破坏应用程序。我无法弄清楚我在做什么来造成他们。
如何监控等待SaveChanges()
调用的排队等待更改?
我正在用ADO.NET实体框架创建一个应用程序。如何查看实体框架的未决更改?
我可以一行一行通过我的代码,一边调试,一边观察执行的每个查询的SQL Server Profiler,但我无法弄清楚所有这些SQL命令来自哪里!
有时当我执行SaveChanges()
时,实体框架会执行意外的怪异插入。他们有时会破坏应用程序。我无法弄清楚我在做什么来造成他们。
如何监控等待SaveChanges()
调用的排队等待更改?
要监控的事件时,实体添加或删除从状态管理器,你可以使用ObjectStateManagerChanged事件:
var ctx = new ModelContainer();
// ...
ctx.ObjectStateManager.ObjectStateManagerChanged += (sender, e) =>
{
Trace.WriteLine(string.Format("{0}, {1}", e.Action, e.Element));
};
由于实体框架5.0 DbContext
有ChangeTracker
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);
谢谢,看起来这是唯一正确的答案EF5 + – Peter 2014-09-02 06:55:10
实体框架6有一个方法,真正有用的。
dbContext.ChangeTracker.HasChanges()
例子:
if (dbContext.ChangeTracker.HasChanges())
{
db.SaveChanges();
}
如果您正在使用的DbContext对象,那么你就需要将其转换为IObjectContextAdapter,然后才能访问ObjectStateManager。示例:(((IObjectContextAdapter)dbcontext).ObjectContext.ObjectStateManager – Corin 2012-10-22 21:13:44