如何查看实体框架的待定更改?

时间:2009-02-26 21:22:54

标签: c# .net entity-framework

我正在使用ADO.NET实体框架创建一个应用程序。

我可以在调试时逐行浏览我的代码,并为每个执行的查询查看SQL Server Profiler,但我无法弄清楚所有这些SQL命令的来源!

有时当我执行SaveChanges()时,实体框架执行意外的,奇怪的INSERTS。他们有时会破坏申请。我无法弄清楚我正在做些什么来引起他们。

如何监控排队等待SaveChanges()来电的待处理更改?

5 个答案:

答案 0 :(得分:48)

由于Entity Framework 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);

答案 1 :(得分:21)

看看

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)

here

答案 2 :(得分:8)

要监控在州经理中添加或删除实体时的事件,您可以使用ObjectStateManagerChanged事件:

var ctx = new ModelContainer();

// ...

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

答案 3 :(得分:3)

实体框架6 有一个方法,非常有用。

dbContext.ChangeTracker.HasChanges()

示例:

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

答案 4 :(得分:0)

当我尝试查看其他答案中提到的ObjectStateManager时,它没有显示在调试器中。在Visual Studio 2017中进行调试时,我发现将以下代码段添加到手表(在引用ObjectStateManager属性之前强制转换dbContext对象)是很有帮助的。

((System.Data.Entity.Infrastructure.IObjectContextAdapter)this.db).ObjectContext.ObjectStateManager

完成监视后,您可以逐行调试,观察哪些操作会添加到列出未决更改的各种属性中。