【问题标题】:How do I navigate through multiple relationships using LINQ to Entities?如何使用 LINQ to Entities 浏览多个关系?
【发布时间】:2009-02-20 14:44:04
【问题描述】:

我刚开始使用 LINQ to Entities,我正在尝试将我们当前在存储过程中执行的搜索复制为 LINQ to Entities 查询。但是,我似乎无法找出正确的方法来查询距查询起点多于一个“连接”的实体的属性。

例如,假设我有表 Campaign、CampaignLocation 和 Location,它们具有从 Campaign 到 CampaignLocation 以及从 CampaignLocation 到 Location 的外键。非常标准的多对多表配置。当我开始像这样编写 LINQ 查询时:

 var campaigns = from c in context.Campaign.CampaignLocation

这是我所能到达的关联链中的尽头。 “CampaignLocation”上似乎没有可用的“Location”属性,因此我可以过滤 Location 的属性。

我尝试使用这样的 LINQ 连接语法:

 var campaigns = from c in context.Campaign
                 join cl in context.CampaignLocation 
                   on c.CampaignID equals cl.CampaignID

但“cl”别名上似乎没有“CampaignID”属性。这真的很奇怪,桌子上有一个名为那个的列。因为它是 Campaign 表的外键,所以它不在模型对象上吗?

我在哪里出错了,我错过了什么?

[更新]

看起来我用于外键的任何整数列都没有被添加为模型对象的属性。显示了外键关系,但不存在 ID 属性。当我从数据库中读取架构时,有什么方法可以让设计人员将这些属性添加到模型中?

【问题讨论】:

  • 我不知道如何防止它消耗作为导航属性的关系,我会做一些测试和研究,看看我是否能提供答案。
  • 即使我能弄清楚如何使用导航属性一直到“位置”,我也很好。我仍然觉得我在这里错过了大部分图片。

标签: linq entity-framework


【解决方案1】:

该属性只是表本身的实体引用,您是否在 EF 模型中为 ComaignLocationLocation 定义了位置关系?然后根据您实际尝试执行的操作(连接等)。我会考虑使用 linq 连接语法、linq 嵌套查询(可以形成连接)或仅使用您最初拥有的 proc。如果最初有一个 proc 的目的,只需将其拉入您的 EF 模型。

编辑更新:

尝试打开模型并从数据库中刷新这些表,列应该在那里,但是可以手动删除它们。即使列到位,您仍然必须自己在 EFModel 中定义关系。

【讨论】:

    【解决方案2】:

    这些有用吗?

        Campaign campaign1 = context.Campaigns.Where(x => x.CampaignID == 1).Single();
        foreach (CampaignLocation campaignlocation in campaign1.CampaignLocations)
        {
            Response.Write(campaignlocation.Location.Name + "<br />");
        }
    
        Location location1 = context.Locations.Where(x => x.LocationID == 3).Single();
        foreach (CampaignLocation campaignlocation in location1.CampaignLocations)
        {
            Response.Write(campaignlocation.Campaign.Name + "<br />");
        }
    

    (我怀疑您缺少外键或对象引用...)

    【讨论】:

      【解决方案3】:

      替代答案 - 如果您在创建数据库后更改了数据库,则需要手动编辑/重新创建 .edmx 文件?

      【讨论】:

      • EF 不在 dbml 上运行,它是 edmx。 linq to sql 模型与 EF 模型不同。
      • 处理建设性批评的好方法!但是,关于答案的实质……好吧,我全心全意地同意,这就是为什么我也提出了建议! (从 DB 刷新 EF 模型)
      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2011-05-14
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多