c# - EF Core .ThenInclude 不包括外部实体并导致查询不检索任何内容
问题描述
我在这里有一个 EF Core 项目,但我在多级包含方面确实遇到了困难。我正在尝试查询与这样相关的条目:
有一个从 accountid 到 accountid 的“朋友”关系的映射表。所以第一层就是这个映射实体。
映射表中账户的 ID 是与各个账户实体相关的外键。
在帐户实体中,有一个帐户在线状态实体的外键。
所以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
实体设置为空。
以下是(精简的)实体:
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; }
推荐阅读
- karate - 空手道框架:#notnull 和 #present 在响应为空的情况下不起作用
- objective-c - 如何在objective-c中将'ï'字母编码为unicode'\u00EF'?
- javascript - 从 xhttp.open("Get") 动态填充下拉列表;回复
- python - Python WMI - 我们真的可以说'C:'始终是引导驱动器吗?
- docker - GITLAB-CI - 加入由 docker-compose 创建的网络
- jenkins - 每当开发人员将更改推送到他们的 beanstalk-git 存储库时,我们如何触发从一个存储库获取源代码的 jenkins 作业?
- c# - 如何通过 CsvHelper 将棱镜属性映射到类?
- perl - 如何将 Find::File 的结果存储到数组中
- openlayers - 在 Openlayers 中打开一个封闭的多边形以继续绘图 - 撤消功能
- html - 关闭一个手风琴选项卡默认打开另一个