我正在使用ADO.NET实体框架创建一个应用程序。
我可以在调试时逐行浏览我的代码,并为每个执行的查询查看SQL Server Profiler,但我无法弄清楚所有这些SQL命令的来源!
有时当我执行SaveChanges()
时,实体框架执行意外的,奇怪的INSERTS。他们有时会破坏申请。我无法弄清楚我正在做些什么来引起他们。
如何监控排队等待SaveChanges()
来电的待处理更改?
答案 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)
答案 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
完成监视后,您可以逐行调试,观察哪些操作会添加到列出未决更改的各种属性中。