EF4 и нежелательная загрузка связанной коллекции с AddObject - PullRequest
6 голосов
/ 02 мая 2011

У меня есть странный случай, когда добавление записи вызывает нежелательную загрузку связанной коллекции.

Например, у меня есть запросы и сеансы.Сессия может содержать много запросов.Я уже загрузил сеанс и просто хочу добавить новый запрос.

Однако, когда я устанавливаю вызов AddObject для ObjectSet репозитория Request, SQL Profiler показывает, что запрос на выборку выполняется для всех связанных запросов наэтот сеанс.

Вот код проблемы:

this._request = new Request
                    {
                        Action = (string)filterContext.RouteData.Values["action"],
                        Controller = filterContext.Controller.GetType().Name,
                        DateAdded = userContext.Session.DateLastActive,
                        IpAddress = filterContext.HttpContext.Request.UserHostAddress,
                        SessionId = userContext.Session.Id
                    };

loggingService.AddRequest(this._request);

Эта последняя строка просто вызывает мой сервис, который, в свою очередь, просто вызывает _objectSet.AddObject(entity).

то же самое произошло бы, если бы я попытался установить новый запрос Session = userContext.Session (вместо указанного выше SessionId = userContext.Session.Id) - запрос будет выполняться при установке этого свойства, а не над AddObject.Таким образом, кажется, что EF4 считает, что ему нужна соответствующая коллекция запросов на сеансе, когда по какой-то причине на него ссылаются.

Но мне не нужны связанные запросы на сеансе, а также на то, что они не используются или на которые не ссылаются.Так что я не уверен, почему EF4 загружает их.Я прошел по коду и убедился, что это происходит именно в строке AddObject(entity) (Profiler показывает, что запрос выполняется в одном и том же экземпляре).

Почему это произойдет и как я могу остановить его?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Это потому, что EF4 пытается добавить новый запрос в соответствующую коллекцию Session.Requests, а также отправляет и извлекает все остальные?Если так, есть ли способ предотвратить это?Как я уже сказал, мне не нужны эти запросы, мне просто нужно добавить их и двигаться дальше.

1 Ответ

6 голосов
/ 02 мая 2011

Полагаю, вы используете шаблон POCO T4, который подозревает именно это поведение. Проблема заключается в методах исправления, сгенерированных шаблоном POCO. Каждый раз, когда вы назначаете свойство навигации, внешний ключ или добавляете объект в коллекцию связанных объектов, эти методы выполняют исправление графа объекта. Это означает, что они также обновляют навигацию по связанной сущности. В вашем сценарии это означает, что методы исправления добавляют Request к Requests коллекции в Session. Доступ к коллекции приведет к отложенной загрузке. Единственные способы избежать этого:

  • Отключить отложенную загрузку для этой операции (context.ContextOptions.LazyLoadingEnabled = false)
  • Удалить Requests свойство из Session
  • Изменить шаблон T4 и удалить методы исправления
  • Изменение шаблона T4 и удаление виртуального из свойства Requests (Session не будет поддерживать отложенную загрузку)
...