这是使用Entity Framework(.NET 3.5)更新多对一关系的正确方法吗?

时间:2012-02-03 16:56:41

标签: c# .net visual-studio-2008 entity-framework

您知道,我正在使用:Visual Studio 2008,.NET 3.5

广告系列与Campaign_Url有多对一的关系, 所以多个广告系列可以共享同一个Campaign_Url。

如下所示:

我从SelectedCampaignID

的上下文中找到Campaign实体
            Campaign aCampagin = (from c in context.Campaign
                                  where c.campaign_id == SelectedCampaignID
                                  select c).First();

使用SelectedCampaignUrlID

从上下文中查找选定的Campaign_Url实体
            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列,其中包含具有CampaignUrl表的CampaignUrlID列的foregin键。

如果我使用普通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 个答案:

答案 0 :(得分:1)

.NET 3.5中的实体框架不允许您直接设置外键。

请参阅第二个示例here

我认为你需要做这样的事情:

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

然后,您应该能够通过密钥而不是按实体来访问关系。

詹姆斯的回答也很好。

修改

请参阅此问题:Entity Framework: Setting a Foreign Key Property

答案 1 :(得分:0)

长期和简短的回答,是的,或者至少我是如何使用实体框架来做的。虽然我可以像这样处理它:

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查询。

答案 2 :(得分:0)

直接更改ID在EF中效果很好。

或者您可以从Campaign_Url中分离()广告系列,然后将其附加()到另一个广告系列。

(从技术上讲,您将其从Campaign_Url.Campaigns或广告系列列表的任何属性中分离出来。)

编辑:好的,这已经得到了解答,但没有一个答案(包括我的)实际上涵盖了我的想法,所以我会再试一次:

而不是

 aCampagin.Campaign_Url = aCampaign_Url;

我相信他们打算你做的是这样的事情:

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

我在我的EF项目中测试了类似的东西,尽管它确实是EF4。