这是用实体框架(.NET 3.5)更新多对一关系的正确方法吗

本文关键字:关系 多对一 更新 方法 实体 框架 NET | 更新日期: 2023-09-27 18:22:19

您知道,我使用的是:Visual Studio 2008,.NET 3.5

Campaign与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();

它给出错误:

属性"campaign_url_id"是对象密钥的一部分信息,不能修改。

这是用实体框架(.NET 3.5)更新多对一关系的正确方法吗

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

请参阅此处的第二个示例。

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

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

然后,您应该能够按键而不是按实体访问关系。

詹姆斯的回答也很好。

编辑:

请参阅此问题:实体框架:设置外键属性

长话短说,是的,或者至少我会使用实体框架这样做。尽管我可能会这样处理:

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

直接更改id在EF中效果良好。

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

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

编辑:好吧,这个问题已经得到了回答,但没有一个答案(包括我的)真正涵盖了我的想法,所以我要再试一次:

代替

 aCampagin.Campaign_Url = aCampaign_Url;

我相信他们想让你做的是这样的事情:

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

我在EF项目中测试了类似的东西,尽管无可否认它是EF4。