Как я могу увидеть ожидающие изменения Entity Framework? - PullRequest
42 голосов
/ 27 февраля 2009

Я создаю приложение с помощью ADO.NET Entity Framework.

Я могу построчно просматривать свой код во время отладки и наблюдать за SQL Server Profiler для каждого выполненного запроса, но я не могу понять, откуда поступают все эти команды SQL!

Иногда, когда я выполняю SaveChanges(), Entity Framework выполняет неожиданные, странные ВСТАВКИ. Иногда они ломают приложение. Я не могу понять, что я делаю, чтобы вызвать их.

Как я могу отслеживать ожидающие изменения, которые стоят в очереди в ожидании SaveChanges() вызова?

Ответы [ 5 ]

48 голосов
/ 11 августа 2014

Поскольку Entity Framework 5.0 DbContext имеет свойство ChangeTracker , которое содержит все ожидающие изменения. Подобно 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);
21 голосов
/ 27 февраля 2009

Взгляните на

myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)

здесь .

8 голосов
/ 22 октября 2012

Чтобы отслеживать события, когда сущности добавляются или удаляются из диспетчера состояний, вы можете использовать ObjectStateManagerChanged событие:

var ctx = new ModelContainer();

// ...

ctx.ObjectStateManager.ObjectStateManagerChanged += (sender, e) =>
{
   Trace.WriteLine(string.Format("{0}, {1}", e.Action, e.Element));
};
3 голосов
/ 01 июля 2017

Entity Framework 6 имеет метод для этого, действительно полезный.

dbContext.ChangeTracker.HasChanges()

Пример:

if (dbContext.ChangeTracker.HasChanges())
{
    db.SaveChanges();
}
0 голосов
/ 09 октября 2018

Когда я попытался просмотреть ObjectStateManager, упомянутый в других ответах, он не появился в моем отладчике. При отладке в Visual Studio 2017 я обнаружил, что полезно добавить следующий фрагмент кода в часы (который преобразует объект dbContext до ссылки на свойство ObjectStateManager).

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

Как только часы сделаны, вы можете построчно отлаживать, наблюдая, какие действия добавляют к различным свойствам, перечисляющим ожидающие изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...