【问题标题】:EF sometimes returns null on foreign key typesEF 有时会在外键类型上返回 null
【发布时间】:2016-02-16 20:13:44
【问题描述】:

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

但是当我在调试模式下单步执行代码时,我得到了预期的结果:

相关控制器方法如下

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,但我怎样才能让它每次都返回预期的结果?

【问题讨论】:

    标签: c# entity-framework asp.net-web-api


    【解决方案1】:

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

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

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

    【讨论】:

    • 我试过了,但后来我得到了Error getting value from 'AwayTeam' on 'System.Data.Entity.DynamicProxies.Pick_300C9B9073E6C214AE564BA2A5A64098700CFA4A782832A5CEC6BD386AB3AA63'.
    • 这个类有一些不能转换成 JSON 的属性。你永远不应该返回整个对象。相反,您应该创建对象的视图模型实例,然后将其序列化为 json。看看这个链接stackoverflow.com/questions/18668617/…
    • 我最终解决了这个问题,只存储了解锁选择的 ID 并使用它来获取要返回的选择列表
    • EF Core 中没有 Configuration 属性。我在EF Core 中使用了this.ChangeTracker.LazyLoadingEnabled = true;,但没有用。但这是对我做的:stackoverflow.com/a/31256921/6778726
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2021-10-28
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多