EF4: свойства навигации и объединения: это ошибка или особенность?

#c# #sql #entity-framework #join

#c# #sql #entity-framework #Присоединиться

Вопрос:

Я хотел бы проконсультироваться по поводу проблемы, с которой я столкнулся. Я начал работать над проектом с очень сложной базой данных: многие таблицы в БД не имеют первичных ключей или имеют несколько PK, поэтому я не могу добавить правильные ассоциации для всех объектов в моем edmx. Однако для некоторых объектов это возможно, и мне удалось это сделать. Таким образом, у меня есть две сущности с ассоциацией между ними: Vulner и VulnerDescription. И у меня есть «плохая» таблица соединений для уязвимостей, называемая VulnerObjectTie (с ментальным FK: VulnerObjectTie.Vulner = Vulner .Идентификатор), к которому я не могу добавить правильные ассоциации. Итак, я решил добавить следующий запрос LinqToEntities:

             var vulerIdList = from vulner in _businessModel.DataModel.VulverSet.Include("Descriptions")
                    join objectVulnerTie in _businessModel.DataModel.ObjectVulnerTieSet on vulner.Id equals objectVulnerTie.Vulner
                    where softwareId.Contains(objectVulnerTie.SecurityObject)
                    select vulner;
  

где description — свойство навигации для связи с таблицей описания уязвимостей. Запрос работает, но он не загружает свойство Descriptions. Однако, если я удалю оператор объединения, описания будут загружены правильно.

Наиболее очевидным решением этой проблемы является разделение одного запроса на следующие два запроса:

             var vulerIdList = from vulner in _businessModel.DataModel.VulverSet
                    join objectVulnerTie in _businessModel.DataModel.ObjectVulnerTieSet on vulner.Id equals objectVulnerTie.Vulner
                    where softwareId.Contains(objectVulnerTie.SecurityObject)
                    select vulner.Id;

        var query = from vulner in _businessModel.DataModel.VulverSet.Include("Descriptions")
                    where vulerIdList.Contains(vulner.Id)
                    select vulner;
  

Но я думаю, что это выглядит некрасиво. Кто-нибудь может предложить более простое решение этой проблемы, или это просто особенность EF4??

спасибо, пожалуйста :))

Ответ №1:

Это известная «особенность» или ограничение, в зависимости от того, как вы на это смотрите. Вот интересная дискуссия на эту тему, я уверен, что есть еще ссылки, которые нужно найти: http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/d700becd-fb4e-40cd-a334-9b129344edc9/

Ответ №2:

Проблема здесь в том, что EF не очень хорошо подходит для «плохих баз данных». EF (и особенно все инструменты автоматизации, такие как model wizard) ожидает четкого и правильного проектирования базы данных.

Include не поддерживается в запросах, использующих пользовательские объединения или проекции. Не поддерживается в этом случае означает, что он полностью опущен.