Откат в Entity Framework 4.0 - PullRequest
       11

Откат в Entity Framework 4.0

0 голосов
/ 12 июля 2010

У меня есть класс Customer, который включает класс Contact, в котором хранятся все контакты для этого конкретного клиента, поэтому они связаны с отношением внешнего ключа.

Вот мой сценарий: пользователь редактирует информацию о клиенте, включая контакты, а затем решает нажать кнопку «Отмена».Контакты связаны с сеткой, поэтому каждый раз, когда выполняется редактирование / добавление / удаление, он автоматически обновляет сущность «Контакт» в контексте кэшированной базы данных.Так как же мне откатить все изменения, сделанные пользователем в сущности «Контакт»?

Я попробовал следующее (после поиска ответов в Google):

    public static void CustomerRollback(Customer customer)
    {
        dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, customer);
        dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, customer.Contacts);
    }

Но это не сработало,Есть еще идеи?Обратите внимание, что моя проблема заключается только в откате сущности «Контакты».Я думаю, что причина проблемы в первую очередь в том, что сетка автоматически обновляет кэшированные объекты.Поэтому, когда я пытаюсь отменить, EntityState для каждого контакта уже перешел в измененное состояние (EntityState.Added, EntityState.Deleted и т. Д.).Нужно ли мне перебирать контакты, проверять их свойство EntityState и что-то с ним делать?

Спасибо, Цезарь

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

Итак, вот что я сделал, это обходной прием из Entity Framework 1.0, я надеялся, что EF 4.0 имеет гораздо более простой способ отката контекста объекта. Пожалуйста, поделитесь со мной, если вы знаете лучший способ, это пока работает:

        // delete added objects that did not get saved
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added))
        {
            if (entry.Entity != null)
                dbContext.DeleteObject(entry.Entity);
        }
        // Refetch modified objects from database
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
        {
            if (entry.Entity != null)
                dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity);
        }
        // Recover modified objects that got deleted
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted))
        {
            if (entry.Entity != null)
                dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity);
        }

        dbContext.AcceptAllChanges();
1 голос
/ 12 июля 2010

Взгляните на метод AcceptAllChanges . SaveChanges (SaveOptions) также может быть полезным.Еще одно решение - использовать экземпляр ObjectContext в качестве единицы работы и создать его для операции, а также сохранять изменения только при необходимости (когда пользователь подтверждает, что это необходимо), просто удаляя контекст в другом случае - это отменит изменениясделано в контексте.

...