簡體   English   中英

EF Core.ThenInclude 不包括外部實體並導致查詢不檢索任何內容

[英]EF Core .ThenInclude does not include foreign entity and causes query to retrieve nothing

我在這里有一個 EF Core 項目,但我在多級包含方面確實遇到了困難。 我正在嘗試查詢與這樣相關的條目:

  1. 有一個從 accountid 到 accountid 的“朋友”關系的映射表。 所以第一層就是這個映射實體。

  2. 映射表中賬戶的 ID 是與各個賬戶實體相關的外鍵。

  3. 在賬戶實體中,有一個在線賬戶 state 實體的外鍵。

所以tl;博士; FriendsMappingTable -> Account -> AccountOnlineState

這是我使用的代碼:

public Task<List<TEntity>> Read(Expression<Func<TEntity, bool>> predicate, params Func<IQueryable<TEntity>, IQueryable<TEntity>>[] foreignIncludes) 
{
    return RunInContextWithResult(async dbSet =>
    {
        var query = dbSet.Where(predicate);

        query = foreignIncludes.Aggregate(query, (current, include) => include(current));

        return await query.ToListAsync();
    });
 }

private async Task<List<TEntity>> RunInContextWithResult([NotNull] Func<DbSet<TEntity>, Task<List<TEntity>>> dbFunc)
{
    await using var ctx = GetContext();

    return await dbFunc(ctx.Set<TEntity>());
}

這是我的呼吁:

var friends = await m_friendsMappingRepository.Read(
            x => x.Id == sessionContext.Account.Id,
            x => x.Include(y => y.Friend).ThenInclude(y => y.AccountOnlineStateEntity));

但是,使用此設置,查詢將根本不返回任何內容。 如果我刪除.ThenInclude() ,它至少會為給定帳戶返回一個相應的朋友實體,其中OnlineState實體設置為 null。

以下是(精簡的)實體:

public interface IEntity<TKeyType>
{
    [NotNull]
    [Key]
    [Column("Id")]
    public TKeyType Id { get; set; }
}

[Table("FriendsMapping")]
public class FriendsMappingEntity : IEntity<int>
{
    [ForeignKey("Account")]
    public int Id { get; set; }

    public AccountEntity Account { 
        get; 
        [UsedImplicitly] private set;
    }

    [Column("FriendId")]
    [ForeignKey("Friend")]
    public int FriendId { get; set; }

    public AccountEntity Friend
    {
        get; 
        [UsedImplicitly] private set;
    }
}

public class AccountEntity : IEntity<int>
{
    [ForeignKey("AccountOnlineStateEntity")]
    public int Id { get; set; }

    [CanBeNull]
    public AccountOnlineStateEntity AccountOnlineStateEntity { get; set; }

    [NotNull]
    public List<FriendsMappingEntity> FriendsTo { get; set; }

    [NotNull]
    public List<FriendsMappingEntity> FriendsFrom { get; set; }
}

public class AccountOnlineStateEntity : IEntity<int>
{
    public int Id { get; set; }

    [Column("OnlineState")]
    public AccountOnlineState OnlineState { get; set; }
}

更新

根據 Ivan 的建議,添加一個 InverseProperty 並從 Account.Id 中刪除 ForeignKey。

    //[ForeignKey("AccountOnlineStateEntity")]
    public int Id { get; set; }

    [CanBeNull]
    [InverseProperty("Account")
    public AccountOnlineStateEntity AccountOnlineStateEntity { get; set; }

並將屬性添加到 AccountOnlineStateEntity

    [ForeignKey("Id")]
    public AccountEntity Account { get; set; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM