Является ли это правильным способом обновления отношения «многие к одному» с Entity Framework (.NET 3.5)? - PullRequest
1 голос
/ 03 февраля 2012

Как вы знаете, я использую: Visual Studio 2008, .NET 3.5

Кампания - это отношение один к одному с Campaign_Url, поэтому для нескольких кампаний может использоваться один и тот же Campaign_Url.

КакВы можете увидеть следующий код:

Я нахожу объект Campaign из контекста с SelectedCampaignID

            Campaign aCampagin = (from c in context.Campaign
                                  where c.campaign_id == SelectedCampaignID
                                  select c).First();

Найти выбранный объект Campaign_Url из контекста с SelectedCampaignUrlID

            CampaignUrl aCampaign_Url = (from c_url in context.CampaignUrlSet
                                         where c_url.campaigin_url_id == SelectedCampaignUrlID
                                         select c_url).First();

Назначитьот сущности CampaignUrl до сущности Campaign

            aCampagin.Campaign_Url = aCampaign_Url;
            context.SaveChanges();

Но в базе данных таблица Campaign имеет столбец url_id, который имеет ключ foregin со столбцом CampaignUrlID таблицы CampaignUrl.

Если я обновляюсь с помощью обычного SQLЯ бы просто

UPDATE Campaign SET url_id  = SelectedCampaignUrlID WHERE Campaign_ID = SelectedCampaignID;

Так что было бы избежать поиска сущности CampaignUrl.

Я не верю, что делаю правильный путь ... Каков будет правильный путьделать это обновление со структурой сущностей?


РЕДАКТИРОВАТЬ: включить случай, который я пытался изменить по ID.

            Campaign aCampagin = (from c in context.Campaign.Include("Campaign_Url")
                                  where c.campaign_id == cam.campaign_id
                                  select c).First();
            aCampagin.Campaign_Url.campaigin_url_id = SelectedCampaignUrlID.Value;
            context.SaveChanges();

Это дает ошибку:

Свойство 'campaigin_url_id' является частью ключевой информации объекта и не может быть изменено.

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Entity Framework в .NET 3.5 не позволяет напрямую устанавливать внешние ключи.

См. Второй пример здесь .

Я думаю, вам нужно сделать что-то вроде этого:

EntityKey campaignUrlId = 
    new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);

Тогда вы сможете получить доступ к связи по ключу, а не по сущности.

Ответ Джеймса тоже хорош.

Edit:

См. Этот вопрос: Entity Framework: установка свойства внешнего ключа

0 голосов
/ 03 февраля 2012

Изменение идентификатора напрямую работает в EF.

Или вы можете отсоединить () кампанию от ее Campaign_Url, а затем прикрепить () к другому.

(Технически, вы бы отсоединили его от Campaign_Url.Campaigns или любого другого свойства для списка кампаний).

РЕДАКТИРОВАТЬ: Хорошо, на это уже был дан ответ, но ни один из ответов (включая мой) на самом деле не охватывает то, что я думал, поэтому я попробую еще раз:

Вместо

 aCampagin.Campaign_Url = aCampaign_Url;

Я верю, что они собираются сделать что-то вроде этого:

aCampagin.Campaign_Url.Campaigns.Remove(aCampaign);
aCampaign_Url.Campaigns.Add(aCampaign);

Я тестировал что-то подобное в своем проекте EF, хотя по общему признанию это EF4.

0 голосов
/ 03 февраля 2012

Длинный и короткий ответ, да, или, по крайней мере, так я бы сделал, используя структуру сущностей.Хотя я мог бы справиться с этим так:

Campaign aCampagin = (from c in context.Campaign
                      where c.campaign_id == SelectedCampaignID
                      select c).First();

aCampagin.Campaign_URL = (from c_url in context.CampaignUrlSet
                          where c_url.campaigin_url_id == SelectedCampaignUrlID
                          select c_url).First();

context.SaveChanges();

Структура сущностей обрабатывает отправленный вами SQL-запрос.

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