Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架(.NET 3.5)更新多对一关系是否正确?_C#_.net_Visual Studio 2008_Entity Framework - Fatal编程技术网

C# 使用实体框架(.NET 3.5)更新多对一关系是否正确?

C# 使用实体框架(.NET 3.5)更新多对一关系是否正确?,c#,.net,visual-studio-2008,entity-framework,C#,.net,Visual Studio 2008,Entity Framework,正如您所知,我使用的是:VisualStudio2008、.NET3.5 Campaign是与Campaign_Url的多对一关系, 因此,多个活动可以共享同一个活动Url 您可以看到以下代码: 我从具有SelectedCampaignID的上下文中找到活动实体 Campaign aCampagin = (from c in context.Campaign where c.campaign_id ==

正如您所知,我使用的是:VisualStudio2008、.NET3.5

Campaign是与Campaign_Url的多对一关系, 因此,多个活动可以共享同一个活动Url

您可以看到以下代码:

我从具有SelectedCampaignID的上下文中找到活动实体

            Campaign aCampagin = (from c in context.Campaign
                                  where c.campaign_id == SelectedCampaignID
                                  select c).First();
从具有SelectedCampaignUrlID的上下文中查找选定的活动\u Url实体

            CampaignUrl aCampaign_Url = (from c_url in context.CampaignUrlSet
                                         where c_url.campaigin_url_id == SelectedCampaignUrlID
                                         select c_url).First();
将活动URL实体分配给活动实体

            aCampagin.Campaign_Url = aCampaign_Url;
            context.SaveChanges();
但在数据库中,活动表有一个url_id列,该列的foregin键与活动url表的活动url id列相同

如果我使用普通SQL进行更新,我会

UPDATE Campaign SET url_id  = SelectedCampaignUrlID WHERE Campaign_ID = SelectedCampaignID;
因此,可以避免搜索活动URL实体

我不相信我做的是正确的方式。。。使用实体框架进行此更新的正确方法是什么


编辑:包含我试图按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\u url\u id”是对象键的一部分 信息,无法修改


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

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();
aCampagin.Campaign_Url.Campaigns.Remove(aCampaign);
aCampaign_Url.Campaigns.Add(aCampaign);
EntityKey campaignUrlId = 
    new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);

实体框架处理您发布的SQL查询。

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

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();
aCampagin.Campaign_Url.Campaigns.Remove(aCampaign);
aCampaign_Url.Campaigns.Add(aCampaign);
EntityKey campaignUrlId = 
    new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);

实体框架处理您发布的SQL查询。

直接更改id在EF中效果很好

或者,您可以将()活动与其活动\ Url分离,然后将()活动附加到另一个活动

(从技术上讲,您可以将其与活动列表的Campaign_Url.campaings或任何属性分离)

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

而不是

 aCampagin.Campaign_Url = aCampaign_Url;
我相信他们想让你做的是这样的:

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();
aCampagin.Campaign_Url.Campaigns.Remove(aCampaign);
aCampaign_Url.Campaigns.Add(aCampaign);
EntityKey campaignUrlId = 
    new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);

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

直接更改id在EF中效果很好

或者,您可以将()活动与其活动\ Url分离,然后将()活动附加到另一个活动

(从技术上讲,您可以将其与活动列表的Campaign_Url.campaings或任何属性分离)

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

而不是

 aCampagin.Campaign_Url = aCampaign_Url;
我相信他们想让你做的是这样的:

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();
aCampagin.Campaign_Url.Campaigns.Remove(aCampaign);
aCampaign_Url.Campaigns.Add(aCampaign);
EntityKey campaignUrlId = 
    new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);

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

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

参见第二个示例

我认为你需要这样做:

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();
aCampagin.Campaign_Url.Campaigns.Remove(aCampaign);
aCampaign_Url.Campaigns.Add(aCampaign);
EntityKey campaignUrlId = 
    new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);
然后,您应该能够通过键而不是实体访问关系

詹姆斯的回答也很好

编辑:


请参阅此问题:

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

参见第二个示例

我认为你需要这样做:

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();
aCampagin.Campaign_Url.Campaigns.Remove(aCampaign);
aCampaign_Url.Campaigns.Add(aCampaign);
EntityKey campaignUrlId = 
    new EntityKey("Context.CampaignUrlSet", "campaign_url_id", SelectedCampaignUrlId);
然后,您应该能够通过键而不是实体访问关系

詹姆斯的回答也很好

编辑:


看到这个问题:

我试过了,但它给了我一个错误“属性'campaigin_url_id'是对象关键信息的一部分,无法修改。”所以这只适用于4.0?@KingChan——是的,我认为这是4.0中的新功能。看看我的答案和我链接的相关问题。我不知道这已经不起作用了。我会把它归档。我试过了,但它给了我一个错误“属性'campaigin_url_id'是对象关键信息的一部分,无法修改。”所以这只适用于4.0?@KingChan——是的,我认为这是4.0中的新功能。看看我的答案和我链接的相关问题。我不知道这已经不起作用了。我将把它归档。是的,因为context.Campaign\u UrlSet是一组完整的活动URL。如果需要为活动分配新的活动\u URL,可以:
Campaign\u URL aCampaign\u URL=new Campaign\u URL();aCampagin.Campaign\u URL=aCampaign\u URL
aCampaign\u URL的Id属性将为0,直到您调用
context.SaveChanges
一个问题,因此,在实体框架中使用Id时,您可能会拉取自上次保存更改以来添加到活动\u URL的所有实体,并且您不一定知道针对哪个实体进行分配。是的,因为context.Campaign_UrlSet是一组完整的活动URL。如果需要为活动分配新的活动\u URL,可以:
Campaign\u URL aCampaign\u URL=new Campaign\u URL();aCampagin.Campaign\u URL=aCampaign\u URL
aCampaign\u URL的Id属性将为0,直到您调用
context.SaveChanges
一个问题,因此,在实体框架中使用Id时,您可能会拉取自上次保存更改以来添加到活动\u URL的所有实体,并且您不一定知道针对哪个实体进行分配。谢谢,它工作了~不知道它应该是新的EntityKey(“EntityContainerName.EntityName”)这就是为什么我一直在获取标识符“上下文”缺少执行选项lol…谢谢,它工作了~不知道它应该是新的EntityKey(“EntityContainerName.EntityName”),这就是为什么我一直在获取标识符“上下文”缺少执行选项lol。。。