【问题标题】:Include after select not load navigation property in Entity Framework core在实体框架核心中选择不加载导航属性后包含
【发布时间】:2017-01-18 06:40:44
【问题描述】:

我使用实体框架核心 1.1。

我有一个像下面这样的查询,我希望拥有 UserProfile 的用户使用 Include 加载 UserProfile。 但是这个查询总是返回 UserProfile null 。

查询:

var user = dbContext.UserMappers
    .Where(e => e.OldUserId == id)
    .Select(e => e.User)
    .Include(e=>e.UserProfile)
    .FirstOrDefault();

型号:

public class UserMapper
{
    [Key, ForeignKey(nameof(User))]
    public string UserId { get; set; }
    public User User { get; set; }
    public int OldUserId { get; set; }
}

public class User : IdentityUser
{
    public bool Suspended { get; set; }
    public string Nickname { get; set; }
    public virtual UserProfile UserProfile { get; set; }
}

public class UserProfile
{
    [Key, ForeignKey(nameof(User))]
    public string UserId { get; set; }
    public string Name { get; set; }
    public string Family { get; set; }
    public string Telephone { get; set; }
}

【问题讨论】:

    标签: entity-framework .net-core entity-framework-core


    【解决方案1】:

    来自 EF Core 文档 - Loading Related Data - 忽略的包含部分(重点是我的):

    如果您更改查询以使其不再返回查询开头的实体类型的实例,则包含运算符将被忽略。

    这与 Include 处理最终查询实体类型的 EF6 不同。我不知道这是当前的限制还是“设计使然”,但现在您必须从需要包含的实体开始查询。

    在你的情况下,它应该是这样的:

    var user = dbContext.Users
        // if you don't have inverse navigation property
        .Where(e => dbContext.UserMappers.Any(um => um.UserId == e.Id && um.OldUserId == id))
        // if you have inverse collection navigation property
        //.Where(e => e.UserMappers.Any(um.OldUserId == id))
        // if you have inverse reference navigation property
        //.Where(e => e.UserMapper.OldUserId == id)
        .Include(e => e.UserProfile)
        .FirstOrDefault();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2018-04-24
      • 2022-01-16
      相关资源
      最近更新 更多