C# EF有时在外键类型上返回null

C# EF有时在外键类型上返回null,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我有一个WebAPI控制器,它需要从数据库返回一个集合,但我还需要从一些实体中删除一些属性。但是,出于某种原因,表示另一个实体的属性返回null,除非有时我在调试模式下单步执行代码。我在下面显示了json响应,其中显示Sport、HomeTeam和AwayTeam为空: 但当我在调试模式下跳过代码时,我得到了预期的结果: 相关控制器方法如下所示 public dynamic Get() { var allPicks = _db.Picks; if (User.Identity

我有一个WebAPI控制器,它需要从数据库返回一个集合,但我还需要从一些实体中删除一些属性。但是,出于某种原因,表示另一个实体的属性返回null,除非有时我在调试模式下单步执行代码。我在下面显示了json响应,其中显示Sport、HomeTeam和AwayTeam为空:

但当我在调试模式下跳过代码时,我得到了预期的结果:

相关控制器方法如下所示

public dynamic Get()
{
    var allPicks = _db.Picks;
    if (User.Identity.IsAuthenticated)
    {
        string userId = User.Identity.GetUserId();
        var picks = _db.UnlockedPicks
            .Include(p => p.SelectedPick.AwayTeam)
            .Include(p => p.SelectedPick.HomeTeam)
            .Include(p => p.SelectedPick.Sport)
            .Where(p => p.UserId == userId);

        var unlockedPicks = picks.Select(p => p.SelectedPick);
        var otherPicks = allPicks.Except(unlockedPicks).Select(p => new
        {
            Analysis = "",
            PickSummary = "",
            Title = p.Title,
            Id = p.Id,
            Sport = p.Sport,
            HomeTeam = p.HomeTeam,
            AwayTeam = p.AwayTeam,
            MatchTime = p.MatchTime,
            PublishTime = p.PublishTime
        });
        return new
        {
            UnlockedPicks = unlockedPicks.OrderByDescending(p => p.MatchTime),
            OtherPicks = otherPicks.OrderByDescending(p => p.MatchTime)
        };
    }
    var publicPicks = allPicks.OrderByDescending(p => p.MatchTime).Select(p => new
    {
        Analysis = "",
        PickSummary = "",
        Title = p.Title,
        Id = p.Id,
        Sport = p.Sport,
        HomeTeam = p.HomeTeam,
        AwayTeam = p.AwayTeam,
        MatchTime = p.MatchTime,
        PublishTime = p.PublishTime
    });
    return new { UnlockedPicks = new Pick[0], OtherPicks = publicPicks };
}

如果没有
Include()
,它每次都返回null,但是如何使它每次都返回预期的结果呢?

这是因为您没有使用延迟加载。禁用延迟加载时,必须调用
Include
,以加载导航属性。如果要加载所有导航属性,而不调用
Include
,则必须激活延迟加载,这可以通过上下文的构造函数完成。像这样:

public partial class SchoolDBEntities : DbContext
{
    public SchoolDBEntities(): base("name=SchoolDBEntities")
    {
        this.Configuration.LazyLoadingEnabled = true;
    }
}

默认情况下,应激活延迟加载。您可能已经在代码中的其他地方停用了它。每次在调试模式下检查导航属性时,也会自动调用它。

这是因为您没有使用延迟加载。禁用延迟加载时,必须调用
Include
,以加载导航属性。如果要加载所有导航属性,而不调用
Include
,则必须激活延迟加载,这可以通过上下文的构造函数完成。像这样:

public partial class SchoolDBEntities : DbContext
{
    public SchoolDBEntities(): base("name=SchoolDBEntities")
    {
        this.Configuration.LazyLoadingEnabled = true;
    }
}

默认情况下,应激活延迟加载。您可能已经在代码中的其他地方停用了它。每次您在调试模式下检查导航属性时,它也会自动调用。

我尝试过,但从“System.Data.Entity.DynamicProxies.Pick”上的“AwayTeam”获取值时出现
错误。
该类具有一些无法转换为JSON的属性。永远不要返回整个对象。相反,您应该创建对象的视图模型实例,然后将其序列化为json。看看这个链接,我最终解决了这个问题,只存储了未锁定拾取的Id,并使用该Id获取要返回的拾取列表。
EF-Core
中没有
Configuration
属性。我使用了
this.ChangeTracker.LazyLoadingEnabled=true在EF Core中,但不起作用。但这对我来说是这样的:我试过了,但后来从System.Data.Entity.DynamicProxies.Pick_300c9b9073e6c214ae564ba2a5a64098700cfa4a7828382a5ec6bd386ab3aa63上的“AwayTeam”获取值时出现了
错误。
这个类有一些无法转换为JSON的属性。永远不要返回整个对象。相反,您应该创建对象的视图模型实例,然后将其序列化为json。看看这个链接,我最终解决了这个问题,只存储了未锁定拾取的Id,并使用该Id获取要返回的拾取列表。
EF-Core
中没有
Configuration
属性。我使用了
this.ChangeTracker.LazyLoadingEnabled=true在EF Core中,但不起作用。但这是对我的: