您知道,我正在使用: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'是对象键的一部分 信息,不能修改。
答案 0 :(得分:1)
.NET 3.5中的实体框架不允许您直接设置外键。
请参阅第二个示例here。
我认为你需要做这样的事情:
EntityKey campaignUrlId =
new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);
然后,您应该能够通过密钥而不是按实体来访问关系。
詹姆斯的回答也很好。
修改强>
答案 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。