Entity Framework 4: Почему я не могу получить ObjectSet производных объектов, а не ObjectQuery? - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть объект «Инвестиции», производный от «BaseEntity».

С _container.BaseEntities.OfType<Investment>() я получаю ObjectQuery, который всегда запрашивает базу данных.

Поэтому я бы предпочелObjectSet<Investment>.

Я не могу понять, почему EF не поддерживает это для производных объектов ... Или так?;)

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

Приветствия

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Вот как это работает в EF ObjectContext API. Если вы попытаетесь создать ObjectSet для производного объекта, вы получите:

ArgumentException: нет EntitySets, определенные для указанного Тип организации «Инвестиции». Если «Инвестиция» является производным типом, использование базовый тип вместо Имя параметра: TEntity

Кроме того, после определения наследования отсутствуют свойства навигации для производных объектов. Ассоциация, предлагающая свойство навигации, заменяется наследованием.

Я также следил за вашими прежними вопросами , который, вероятно, является источником этого, и я должен сказать, что много пробовал, но никогда не смогу понять ваше поведение. Даже если я вызываю Count напрямую к ObjectSet, я всегда получаю SQL-запрос (проверяется в профилировщике) и количество объектов в базе данных, а не в наборе.

0 голосов
/ 19 апреля 2011

ObjectQuery<T> не всегда запрашивает базу данных. Это всего лишь спецификация запроса - в данном случае это спецификация, возвращающая все BaseEntities типа Investment. Вы можете составить его с помощью дополнительных фильтров или предложений, предложений или проекций порядка и т. Д. В базе данных ничего не выполняется, пока вы не примените какой-либо жадный оператор, такой как ToList() или First() и т. Д., Или пока вы не примените цикл foreach для извлечения результатов.

...