Долгоживущий контекст Entity Framework - лучший способ избежать проблем с целостностью данных

В качестве очень элементарного сценария возьмем эти две операции:

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, например) context.

Как вы, ребята, справляетесь с такими ситуациями?

5
задан e36M3 28 December 2011 в 17:14
поделиться