#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
не поддерживается в запросах, использующих пользовательские объединения или проекции. Не поддерживается в этом случае означает, что он полностью опущен.