Повышение производительности на DAL, когда он реализован с использованием Entity Framework - PullRequest
0 голосов
/ 29 декабря 2010

Я реализую DAL, используя Entity Framework.У нас есть несколько классов DAL (я называю их репозиториями), создающих или получающих контекст по параметрам при каждом вызове метода.Мне не нравится такое поведение;Я не задокументирован по этой проблеме, но мой здравый смысл говорит мне, что создание контекста потребляет слишком много системных ресурсов.Итак:

  1. Является ли инстанцирование контекста дорогим?
  2. Если вы ответили «да» на 1, как бы вы решили эту проблему с точки зрения дизайна?
  3. Если вы ответили «да» на 1, как бы вы реализовали решение в C #?
  4. Какой подход вы рекомендуете для реализации DAL для веб-приложения?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

мой здравый смысл говорит мне, что создание контекста потребляет слишком много системных ресурсов

Здравый смысл почти бесполезен, когда речь заходит об оптимизации.

Что именно в конструктореконтекста, как вы думаете, будет проблематично?Вы читали источник для этого?

1) Является ли создание экземпляра контекста дорогим?

Относительно чего?По сравнению с количеством времени, необходимым для установления соединения с базой данных?По сравнению со временем, которое требуется для поиска DNS на вашем сайте?По сравнению с тем, сколько времени браузер может потратить на рендеринг вашей страницы?

Похоже, создание экземпляра контекста не особенно трудоемко по сравнению со временем, необходимым для фактического получения данных по сети.

2) Если вы ответили «да» на 1, как бы вы решили эту проблему с точки зрения дизайна?

Используйте UnitOfWork абстракцию. Каждый UnitOfWork должен содержать отдельный контекст сущности .Если это веб-приложение, у вас должен быть один UnitOfWork на запрос.

1 голос
/ 29 декабря 2010

Управление временем жизни контекста имеет решающее значение при использовании ORM.Контекст структуры сущностей хранит информацию о загруженных сущностях для отложенной загрузки и отслеживания изменений, и его объем памяти может расти очень быстро.Если вы не избавитесь от контекста, у вас, по сути, будет утечка памяти.

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

using (var context = new DataContext())
{
    context.Products.Add(product);
    context.SaveChanges();
}

Приведенный выше пример показывает, что контекст удаляется слишком быстро, чтобы воспользоваться преимуществами отслеживания изменений.

Для веб-приложений следует использовать контекст для запроса.

ДляПриложения Win Form вы можете избавиться от своего контекста при переходе от одной формы к другой.

...