在Entity Framework核心中選擇未加載導航屬性後包含

.net-core entity-framework entity-framework-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();

楷模:

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; }
}

熱門答案

從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();


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因