我使用实体框架核心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();
型号:
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; }
}
答案 0 :(得分:7)
来自EF Core文档 - Loading Related Data - 忽略包含部分(突出显示是我的):
如果更改查询以使其不再返回查询以开头的实体类型的实例,则忽略包含运算符。
这与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();