这是用实体框架(.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中的实体框架不允许直接设置外键。
请参阅此处的第二个示例。
我认为你需要做这样的事情:
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。