Как справиться с оптимистичным параллелизмом Entity Framework «один ко многим» в веб-приложении? - PullRequest
0 голосов
/ 09 мая 2018

Как Entity Framework 6 обрабатывает оптимистичный параллелизм отношения один-ко-многим в приложении ASP.NET MVC? У меня проблемы с определением того, что EF должен уметь обрабатывать сам, а что я должен делать вручную. Почти каждая статья, которую я нахожу о проверке параллелизма EF в веб-приложении, рассматривает только простой случай, когда столбец RowVersion или столбец Timestamp используется как поле параллелизма; они, кажется, не упоминают проверку параллелизма отношений.

Я буду краток со следующим объяснением, поскольку я предполагаю, что в этом нет ничего нового для людей, которые могут ответить на этот вопрос. Поскольку это веб-приложение, я распоряжаюсь состоянием Entity Framework при каждом обмене данными с сервера. В простом случае обновления столбца в таблице я должен сохранить значения полей, которые используются для оптимистичного параллелизма (например, RowVersion), на странице HTML, а затем отправить их обратно на сервер при отправке страницы. Когда страница отправлена, я извлекаю текущую запись базы данных с помощью EF, обновляю ее значениями параллелизма со страницы HTML, устанавливаю состояние объекта EF DbEntityEntry в EntityState.Unchanged, а затем устанавливаю другие значения со страницы в EF запись. Затем EF может выполнить собственную проверку параллелизма при вызове SaveChanges (). Итак, как должны работать отношения один-ко-многим с этим шаблоном?

Вот конкретный (хотя и надуманный) пример. Предположим, у меня есть модель одного альбома для многих песен. Пользователь1 и пользователь2 одновременно начинают изменять один и тот же альбом, обновляя композиции. Пользователь1 добавляет песню, а пользователь2 удаляет песню. Что я должен сделать, чтобы EF автоматически обнаружил, что Пользователь1 добавил песню, прежде чем Пользователь2 удалил ее (или наоборот)? Или мне придется вручную определять, что список песен изменился? Один из возможных способов - сделать что-то вроде обновления столбца SongModifiedVersion в альбоме, когда песня добавлена ​​или удалена, и заставить EF использовать SongModifiedVersion в качестве поля параллелизма, аналогично предложению в Параллелизм Entity Framework с несколькими таблицами / объектами ). Есть ли другой способ?

Спасибо, Билл

1 Ответ

0 голосов
/ 11 мая 2018

Я обычно полагаюсь на поддержку транзакций БД и уровня изоляции для управления параллелизмом, а не вручную. В этом случае я бы проверил, какой уровень изоляции из вашей БД лучше всего соответствует вашим потребностям / модели параллелизма в бизнесе.

Я также никогда сам не изменяю EntityState вручную и полагаюсь на EF для отслеживания изменений.

...