EF Core .ThenInclude не включает в себя стороннюю сущность и приводит к тому, что запрос ничего не получает - PullRequest
1 голос
/ 12 апреля 2020

У меня есть проект EF Core, но у меня есть трудности с многоуровневыми включениями. Я пытаюсь запросить записи, которые имеют отношение к этому:

  1. Существует таблица сопоставления отношений «друг» от accountid к accountid. Таким образом, первый уровень - это объект сопоставления.

  2. Идентификаторы счетов в таблице сопоставления являются внешними ключами, относящимися к соответствующему объекту счета.

  3. Внутри сущности учетной записи существует внешний ключ для сущности состояния учетной записи в сети.

So tl; dr; 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, установленной на ноль.

Вот (урезанные) сущности:

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

1 Ответ

1 голос
/ 12 апреля 2020

Обновление

Основываясь на предложении Ивана, добавьте InverseProperty и удалите ForeignKey из Account.Id.

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

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

И добавьте свойство в AccountOnlineStateEntity

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