EntityFramework 5 — InvalidOperationException при доступе к DbContext.ChangeTracker.Entries

в моей реализации DbContext, если есть метод с именем «IsModified». Это используется приложением, чтобы показать какое-то «грязное» состояние. В методе я получаю доступ к ChangeTracker DbContext, как показано ниже.

Если я получаю доступ к ChangeTracker.Entries, когда данные загружаются/материализуются из базы данных, я получаю InvalidOperationException, поскольку внутренняя коллекция stateentry изменилась.

Есть ли способ обойти это без простого использования try/catch. Или, может быть, есть более эффективный способ отслеживания измененного состояния контекста?

public bool IsModified()
{
    return this.ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);
}



Ответы (1)


Преобразуйте свой DbContext в ObjectContext и попробуйте следующую реализацию IsModified:

var context = new YourDbContext();
var adapter = (IObjectContextAdapter)context;
var objectContext = adapter.ObjectContext;
...

public bool IsModified()
{
    bool modified = 
    context.ObjectStateManager.GetObjectStateEntries(~EntityState.Unchanged);
                               .Any();
    return modified;
}

вы также можете попытаться обработать событие context.ObjectStateManager.ObjectStateManagerChanged и обновить свое свойство в этом событии. Должно быть более элегантно.

person Andrew    schedule 15.04.2014
comment
Решение с ObjectStateManager.GetObjectStateEntries похоже работает. Спасибо. Событие ObjectStateManagerChanged не работает, поскольку оно срабатывает только при добавлении или удалении элементов. Не тогда, когда предметы меняются. msdn.microsoft.com /en-us/библиотека/ - person raisr; 15.04.2014
comment
~EntityState.Unchanged означает любое состояние, кроме Без изменений. Каждое состояние, включая EntityState.Detached. Пожалуйста, проверьте этот случай, чтобы избежать ошибок. - person Andrew; 15.04.2014