【问题标题】:Navigation Properties Missing After Left Join左连接后缺少导航属性
【发布时间】:2017-12-21 16:06:20
【问题描述】:

我正在尝试对两个具有导航属性的实体进行左连接。我已禁用延迟加载。

这是我的代码:

var awis =
            from ai in Context.AdItems
                            .Include(ai => ai.Item)
                            .Include(ai => ai.Item.Buyer)
                            .Include(ai => ai.Item.OrderHeader)
                            .Where(ai => ai.AdYear == adYear && ai.AdNumber == adNumber)
            join si in Context.StoreItems
                            .Include(si => si.Store)
                            .Where(si => si.StoreId == storeId) on ai.ItemId equals si.ItemId into x
            from r in x.DefaultIfEmpty()
            select new AdWeekItem
            {
                AdItemId = ai.AdItemId,
                AdItem = ai,
                StoreItemId = r == null ? 0 : r.StoreItemId,
                StoreItem = r
            };

外部连接工作正常,但我的导航属性没有包含在预计的 AdWeekItem 中。

AdWeekItem.AdItem.Item为空等

如何包含这些导航属性并进行左外连接?

【问题讨论】:

  • 我已明确禁用延迟加载。我不想使用延迟加载。
  • 您是否在上下文创建中定义了适当的外键?
  • public int ItemId { get; set; } [ForeignKey(nameof(ItemId))] public Item Item { get; set; }
  • 您应该将外键应用于外键属性而不是导航属性,例如 [ForeignKey("Item")] public int ItemId { get; set; } public Item Item { get; set; }
  • 这就是我所拥有的:/// <summary> /// A foreign key to the item. /// </summary> [ForeignKey(nameof(Item))] public int ItemId { get; set; } /// <summary> /// A navigation property to the item. /// </summary> [ForeignKey(nameof(ItemId))] public Item Item { get; set; } 我两者都有。这适用于所有其他关系在我所有其他查询中,当我使用 Include 方法时。

标签: entity-framework entity-framework-6


【解决方案1】:

在 EF6 中,当 LINQ 查询以投影 (select new ...) 结束时,Includes 是 always ignored。您唯一的选择是显式查询您想要包含的导航属性,然后投影到最终结果:

var temp = from ai in Context.AdItems
                             .Where(ai => ai.AdYear == adYear && ai.AdNumber == adNumber)
            join si in Context.StoreItems
                              .Where(si => si.StoreId == storeId) on ai.ItemId equals si.ItemId into x
            from r in x.DefaultIfEmpty()
            select new 
            {
                AdItemId = ai.AdItemId,
                AdItem = ai,
                ai.Item,
                ai.Item.Buyer,
                ai.Item.OrderHeader,
                StoreItemId = r == null ? 0 : r.StoreItemId,
                StoreItem = r,
                r.Store
            };

var awis = from x in temp.AsEnumerable() // pull into memory and continue           
            select new AdWeekItem
            {
                AdItemId = x.AdItemId,
                AdItem = x.AdItem,
                StoreItemId = x.StoreItemId,
                StoreItem = x.StoreItem
            };

EF 将通过relationship fixup(即导航属性的自动填充)填充AdItem.Item 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多