Кэширование при загрузке объектов из базы данных в Entity Framework - PullRequest
0 голосов
/ 26 августа 2010

Вот моя самая простая структура

Customer
   CustomerID
   FirstName
   LastName
   ...
   BrokerID <- Navigation Property created with this FK

Broker
   BrokerID
   FirstName
   LastName

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

Я предполагаю, что по умолчанию EF будет возвращать новый экземпляр Broker для каждого клиента и запрашивать брокер загрузки для каждого брокера, даже если он повторяется.

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

1 Ответ

2 голосов
/ 27 августа 2010

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

Вторая часть вашего вопроса сложнее, поскольку она связана с запросом, выполненным в базе данных.Я не проверял это с EF, но в запросе Linq-To-Sql отличались в зависимости от количества свойств навигации, загруженных с основным объектом.Если вы загрузили только одно свойство навигации, оно обычно выполняло простое объединение, поэтому записи дублировались.Но в случае нескольких навигационных свойств запрос делился на несколько запросов с загрузкой данных из отдельных таблиц.Так что это поведение было каким-то образом оптимизировано по умолчанию.

...