У меня есть проект EF Core, но у меня есть трудности с многоуровневыми включениями. Я пытаюсь запросить записи, которые имеют отношение к этому:
Существует таблица сопоставления отношений «друг» от accountid к accountid. Таким образом, первый уровень - это объект сопоставления.
Идентификаторы счетов в таблице сопоставления являются внешними ключами, относящимися к соответствующему объекту счета.
Внутри сущности учетной записи существует внешний ключ для сущности состояния учетной записи в сети.
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; }
}