Multipleactiveresultsets в Entity Framework 4.1 Первый код

Это мой первый проект EF, поэтому несите меня.

При обновлении объекта, такого как Департамент, вы извлекаете его из контекста, обновляете его значения и вызываете контекст .SaveChanges. Однако, если вы обновите Part.Employees, EF не найдет это забавным.

Я искал и придумал вариант установки Multipleactiveresultsets = true в строке соединения, но хочу знать, есть ли:

  • Это рекомендуемый способ?
  • Оказывает ли это негативное влияние на производительность/на что я должен обратить внимание?

Ответы

Ответ 1

Включение MARS необходимо только в том случае, если вы хотите выполнять несколько запросов на одном и том же соединении параллельно. Это происходит, если вы делаете что-то вроде этого:

/* Foreach uses an iterator over the resultset of your query, but the query is not fetched
   immediately, instead the iterator internally triggers fetching for single
   processed record from opened data reader. Because of that the query and the reader
   are active until the iteration is over. */
foreach (var department in context.Departments.Where(...))
{
    /* The first query is still active on the connection but now you are executing
       lazy loading of all related employees =>. You are executing a second query and,
       without MARS, you will get an exception. */
    var employee = department.Employees.FirstOrDefault(...);
}

Как этого избежать?

  • Использовать нетерпеливую загрузку вместо ленивой загрузки: context.Departments.Include(d => d.Employees)
  • Материализуйте набор результатов всего отдела до использования ленивой загрузки. Это означает отсутствие доступа к сотрудникам внутри цикла.
  • Включить MARS, и указанный пример будет просто работать

Это рекомендуемый способ? Оказывает ли это негативное влияние на производительность/ на что я должен обратить внимание?

Это зависит от проблемы, которую вы пытаетесь решить. Если у вас есть несколько отделов для обработки, доступ к их коллекциям сотрудников вызовет отдельный запрос для каждого отдела. Это называется проблемой N + 1 - у вас есть N отделов и один запрос для их извлечения, и для каждого отдела вы будете выполнять один дополнительный запрос = > N + 1 запросов. Для огромного количества отделов это будет убийцей производительности.

Нежелательная загрузка также не является пуленепробиваемым решением. Он может влиять на производительность, а также. Иногда вам просто нужно выполнить отдельные запросы, чтобы получить все необходимые отделы и отдельные запросы для извлечения всех необходимых сотрудников. Если у вас отключена ленивая загрузка, она должна исправить ваши отношения и правильно заполнить свойство Employees. Кстати, я сделал предложение в Data UserVoice для поддержки этой функции из коробки.