2010-08-26 4 views
0

Вот мои Простейшие структурыкэширования при загрузке объектов из базы данных в Entity Framework

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

Broker 
    BrokerID 
    FirstName 
    LastName 

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

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

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

ответ

2

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

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

+0

IdentityMap интересен, я не знал об этом, но, я думаю, это даже подвержено проблеме параллелизма, если у двух клиентов есть один и тот же брокер, свойство навигации имеет один экземпляр объекта брокера? загружен в один запрос? –

+1

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

Смежные вопросы