Чи є спосіб дізнатись, чи є незбережені зміни в моєму контексті сутності, в Entity Framework?
Відповіді:
Це може спрацювати (якщо під змінами ви маєте на увазі додані, видалені та змінені сутності):
bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() +
context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() +
context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count()
) > 0;
Редагувати:
Покращений код:
bool changesMade = context.
ObjectStateManager.
GetObjectStateEntries(EntityState.Added |
EntityState.Deleted |
EntityState.Modified
).Any();
Any()ні Count() > 0.
EntityState.Modified). eq, якщо замінити значення самостійно, EF повернеться 1 modified object. Вам слід заздалегідь перевірити, чи не відрізняється значення.
Починаючи з EF 6, є context.ChangeTracker.HasChanges().
Для тих, хто використовує EF 4+, ось еквівалентне рішення як метод розширення:
public static class DbContextExtensions {
public static Boolean HasPendingChanges(this DbContext context) {
return context.ChangeTracker.Entries()
.Any(e => e.State == EntityState.Added
|| e.State == EntityState.Deleted
|| e.State == EntityState.Modified);
}
}
Зверніть увагу, що ви не можете поєднувати значення як бітову маску. Функція GetObjectStateEntries()обробляла логіку для вас, але LINQ не дасть належних результатів.
EntityStateбо EntityState.Addedє від, System.Data.Entityа не від System.Data.
if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }