Как мне перемещаться по нескольким отношениям, используя LINQ to Entities? - PullRequest
3 голосов
/ 20 февраля 2009

Я только начинаю с LINQ to Entities и пытаюсь повторить поиск, который мы сейчас выполняем в хранимой процедуре, как запрос LINQ to Entities. Тем не менее, я не могу понять, как правильно запрашивать свойства объектов более чем на одно «соединение» от начальной точки моего запроса.

Например, скажем, у меня есть таблицы Campaign, CampaignLocation и Location, в которых есть внешние ключи от Campaign до CampaignLocation и CampaignLocation to Location. Довольно стандартная конфигурация таблицы «многие ко многим». Когда я начинаю писать свой запрос LINQ, как это:

 var campaigns = from c in context.Campaign.CampaignLocation

это настолько далеко в цепочке ассоциаций, насколько я могу. Похоже, что в «CampaignLocation» нет свойства «Location», чтобы я мог фильтровать свойства Location.

Я пытался использовать синтаксис соединения LINQ следующим образом:

 var campaigns = from c in context.Campaign
                 join cl in context.CampaignLocation 
                   on c.CampaignID equals cl.CampaignID

Но в псевдониме "cl", похоже, нет свойства "CampaignID". Что действительно странно, на столе есть колонка с таким названием. Разве это не на объекте модели, поскольку это внешний ключ к таблице Campaign?

Где я здесь ошибаюсь и что мне не хватает?

[UPDATE]

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

Ответы [ 3 ]

1 голос
/ 20 февраля 2009

Свойство является просто ссылкой на сущность вне самой таблицы. Есть ли у вас отношение Location, определенное в вашей модели EF для ComaignLocation <-> Location? Затем, в зависимости от того, что вы на самом деле пытаетесь сделать (объединение и т. Д.), Я мог бы рассмотреть возможность использования синтаксиса соединения linq, вложенного запроса linq (может образовать объединение) или просто использования процесса, который вы изначально имели. Если изначально была цель иметь процесс, просто включите его в свою модель EF.

Редактировать для обновления:

Попробуйте открыть модель и выполнить обновление из БД для этих таблиц, столбцы должны быть там, однако их можно удалить вручную. Даже при наличии столбцов вы все равно должны сами определить отношения внутри EFModel.

0 голосов
/ 20 февраля 2009

Альтернативный ответ - Вам нужно вручную отредактировать / воссоздать файл .edmx, если вы изменили базу данных с момента ее создания?

0 голосов
/ 20 февраля 2009

Это работает?

    Campaign campaign1 = context.Campaigns.Where(x => x.CampaignID == 1).Single();
    foreach (CampaignLocation campaignlocation in campaign1.CampaignLocations)
    {
        Response.Write(campaignlocation.Location.Name + "<br />");
    }

    Location location1 = context.Locations.Where(x => x.LocationID == 3).Single();
    foreach (CampaignLocation campaignlocation in location1.CampaignLocations)
    {
        Response.Write(campaignlocation.Campaign.Name + "<br />");
    }

(я подозреваю, что вам не хватает ни внешнего ключа, ни ссылки на объект ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...