Чи є спосіб дізнатись, чи є незбережені зміни в моєму контексті сутності, в 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(); }