EF代码优先连接表返回空对象

时间:2017-01-03 05:12:47

标签: entity-framework .net-core

我在使用EF Core Code First创建的连接表时遇到问题。

这是我的班级结构:

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<FooBar> FooBars { get; set; }
}

public class Bar
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<FooBar> FooBars { get; set; }
}

public class FooBar
{
    public int Id { get; set; }
    public Models.Foo Foo { get; set; }
    public Models.Bar Bar { get; set; }
    public int Quantity { get; set; }
}

返回FooBar时我遇到的问题是Foo正确返回所选的Foo对象。而酒吧是空的。

我对数据的查询是这样完成的:

        var foo = _context.Foo
            .Include(r => r.FooBar)
            .FirstOrDefault(x => x.Id == message.Id);

但是,在数据库中,它正确设置了bar的ID,如下所示:

SELECT [Id]       [FooId]       [BarId]       ,[数量]   来自[dbo]。[FooBar]

Id FooId Quantity BarId 1 2 5 2

检查FooBar表上的Keys,我可以看到以下内容:

  • PK_FooBar
  • FK_FooBar_Foo_FooId
  • FK_FooBar_Bar_BarId

我做错了什么阻止Bar被退回? 目前没有什么是显而易见的。

欢呼声

2 个答案:

答案 0 :(得分:1)

您需要通过使用ThenInclude链接来显式加载Bar。由于实体框架中的延迟加载行为,Bar不会被默认加载,以节省潜在的堆栈溢出并仅加载所需的内容。

因此,尽管Bar附加到FoorBar但未加载,因此为空。

答案 1 :(得分:0)

通过添加ThenInclude:

解决了这个问题
var foo = _context.Foo
            .Include(r => r.FooBar)
                .ThenInclude(x => x.Bar)
            .FirstOrDefault(x => x.Id == message.Id);

不知道为什么我必须在返回Foo时包含ThenInclude for Bar。如果有人对此有任何启示,那就太棒了。

感谢