在Entity Framework核心中选择未加载导航属性后包含

Moh*_*ari 5 entity-framework entity-framework-core .net-core

我使用实体框架核心1.1.

我有一个如下所示的查询,我希望通过使用Include来加载UserProfile的用户加载UserProfile.但是此查询始终返回UserProfile null.

查询:

var user = dbContext.UserMappers
    .Where(e => e.OldUserId == id)
    .Select(e => e.User)
    .Include(e=>e.UserProfile)
    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

楷模:

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; }
}
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 8

从EF Core文档 - 加载相关数据 - 忽略包括部分(突出显示是我的):

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

这与EF6不同,后者Include适用于最终查询实体类型.我不知道这是当前的限制还是"按设计",但是现在你必须用需要包含的实体开始查询.

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

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();
Run Code Online (Sandbox Code Playgroud)