Entity Framework Управление контекстом - PullRequest
4 голосов
/ 14 июня 2011

У меня есть несколько вопросов, касающихся управления экземплярами контекста структуры сущностей.

Моя кодовая база состоит из множества независимых компонентов / агентов, работающих в одном процессе, которые могут выполнять работу только путем чтения сообщений из соответствующих очередей вих удобство (когда компонент готов, он будет забирать следующее сообщение из очереди, чтобы не было проблем с параллелизмом на уровне компонента)

Каждый из компонентов должен взаимодействовать с базой данных независимо от других компонентов.Мне интересно, как лучше настроить контекстные экземпляры для каждого компонента.Вот некоторые из параметров

1> Иметь один экземпляр контекста, используемого всеми компонентами.-> Я думаю, что это наихудшее, поскольку оно создает много проблем с параллелизмом?

2> Предоставить каждому компоненту независимый экземпляр контекста.-> Это выглядит хорошо, но

  • нормально ли иметь много контекстно-независимых экземпляров в одном процессе, когда все компоненты одновременно работают в этом процессе?

  • Должен ли я создавать новый экземпляр контекста для каждого нового сообщения, которое будет обрабатывать компонент, или сохранять один экземпляр контекста для жизни компонента?Я думаю, что последний имеет больше смысла, но я более привык использовать контекст в скобках использования {}, и я не уверен, что поддержание одного контекста в течение жизни каждого компонента имеет какие-либо сложности в том, как я его использую?

  • Могу ли я рассчитывать на оптимистическую параллельность, чтобы два разных независимых компонента не помещали одну и ту же запись в базу данных, если все контексты находятся в одном процессе?

Кстати, я использую Entity Framework 4.1.

1 Ответ

3 голосов
/ 14 июня 2011

Определенно используйте один контекст на компонент / агент - если компонент многопоточный, используйте один контекст на поток. Если каждая обработка сообщения выполняется как отдельная «логическая транзакция», тогда используйте один контекст на обработку сообщения.

Почему:

  • Внутри контекста используются два очень важных шаблона проектирования - Карта идентичности и Единица работы. Этот ответ описывает поведение, навязанное этими шаблонами.
  • Контекст и все остальное в EF не является потокобезопасным.

Оптимистичный параллелизм не означает, что разные контексты не будут помещать одну и ту же запись в базу данных. Оптимистический параллелизм означает, что операторы обновления сравнивают текущее состояние в базе данных с последним известным состоянием по контексту (существует задержка между загрузкой записи и сохранением новых значений, и другой контекст может изменить запись). Если запись изменилась, вы получите исключение, и вы должны как-то его обработать.

...