В качестве очень элементарного сценария, давайте возьмем эти две операции:
UserManager.UpdateFirstName(int userId, string firstName)
{
User user = userRepository.GetById(userId);
user.FirstName = firstName;
userRepository.SaveChanges();
}
InventoryManager.InsertOrder(Order newOrder)
{
orderRepository.Add(newOrder);
orderRepository.SaveChanges();
}
Я использовал EF только в веб-проектах и в значительной степени полагался на природу Интернета без состояния. При каждом запросе я получал бы свежую копию контекста, внедренную в мои фасадные объекты бизнес-уровня (сервисы, менеджеры, как бы вы их ни называли), причем все бизнес-менеджеры делят один и тот же экземпляр контекста EF. В настоящее время я работаю над проектом WPF и внедряю бизнес-менеджеров, а затем и репозитории, которые они используют, непосредственно в модель представления.
Давайте предположим, что пользователь находится на сложном экране, и его первое нажатие кнопки вызывает метод UpdateFirstName (). Давайте предположим, что SaveChanges () не работает по любой причине. Их второе нажатие кнопки вызовет метод InsertOrder ().
В Интернете это не проблема, поскольку контекст для операции # 2 не связан (новый http-запрос) с контекстом, используемым операцией # 1. На рабочем столе, однако, это тот же контекст между обоими действиями. Проблема возникает в том факте, что имя пользователя было изменено и как таковое отслеживается контекстом. Несмотря на то, что оригинальный SaveChanges () не выполнял (скажем, база данных была недоступна в то время), вторая операция, вызывающая SaveChanges (), не только вставит новый порядок, но и обновит имя пользователя. Почти во всех случаях это нежелательно, так как пользователь давно забыл о своем первом действии, которое все равно не удалось.
Это, очевидно, глупый пример, но я всегда стремлюсь столкнуться с такого рода сценариями, в которых я хотел бы просто начать все заново с нового контекста для каждого действия пользователя, а не для того, чтобы прожить дольше (для жизни Окно WPF, например) контекст.
Как вы, ребята, справляетесь с такими ситуациями?