asp.net - Dotnet 5.0 引用不包含的子实体
问题描述
我在一个使用 dotnet 5 的 dotnet 项目中。这个项目不是代码优先,我正在使用“dotnet ef dbcontext scaffold”创建实体关系,我遇到了这个问题:
我有一个指向自身的实体: LegalPerson -> LegalPersonParent
public partial class LegalPerson
{
[Key]
[Column("id")]
public long Id { get; set; }
[Column("idPessoa")]
public long PersonId { get; set; }
[Column("idPessoaJuridicaPai")]
public long? LegalPersonParentId { get; set; }
[Column("idRamoDeAtividade")]
public long? ActivityBranchId { get; set; }
[ForeignKey(nameof(LegalPersonParentId))]
public virtual LegalPerson LegalPersonParent { get; set; }
[ForeignKey(nameof(PersonId))]
public virtual Person Person { get; set; }
[ForeignKey(nameof(ActivityBranchId))]
public virtual ActivityBranch ActivityBranch { get; set; }
}
但是当我得到所有 LegalPersons 时,我也得到了 LegalPersonParent。
context.LegalPersons.ToList();
返回:
[
{
"id": 1365,
"personId": 1,
"legalPersonParentId": 1367,
"activityBranchId": 1,
"legalPersonParent": {
"id": 1367,
"personId": 6,
"legalPersonParentId": null,
"activityBranchId": null,
"legalPersonParent": null,
"person": null,
"activityBranch": null
},
"person": null,
"activityBranch": null
},
... more data
]
我想要的是仅在添加 Include 方法时添加 LegalPersonParent ,例如:
context.LegalPersons.Include(legalPerson => legalPerson.LegalPersonParent).ToList();
还有更多有趣的事情发生。返回 context.LegalPersons.ToList(); 以前,ActivityBranch 和 Person 工作正常,没有获取实体,只有参考 id -> activityBranchId 和 personId
发生的另一件有趣的事情是,当我搜索一个 LegalPerson 时,它没有得到 LegalPersonParent:
_context.LegalPersons.FirstOrDefault(legalPerson => legalPerson.Id == id);
返回:
{
"id": 1365,
"personId": 1,
"legalPersonParentId": 1367,
"activityBranchId": 1,
"legalPersonParent": null,
"person": null,
"activityBranch": null
}
数据库上下文:
modelBuilder.Entity<LegalPerson>(entity =>
{
entity.HasIndex(e => e.PersonId, "IDX_PessoaJuridica_idPessoa")
.HasFillFactor((byte)70);
});
解决方案
上下文缓存结果,当您获得所有 LegalPerson 实体时,EF 知道 LegalPersonParent ID 的 LegalPerson 是什么,所以把它放在那里,当您只获得一个 LegalPerson 时,EF 不知道 LegalPersonParent ID 的 LegalPerson 是什么,如果LegalPersonParentID 与所选的 LegalPerson 不同
如果您在获得具有相同上下文的所有 LegalPerson 之前获得所有 ActivityBranch,您会看到所有 ActivityBranch 也已解决
推荐阅读
- javascript - 当单击javascript中的复选框时,动态字符限制长度上的textarea的字符数?
- html - 如何从 WordPress 项目中编码的图像 html 标记中删除通用 css 属性?
- javascript - 在 Javascript 中为循环中生成的每个值创建一个按钮
- html - 限制文件输入类型控制只选择文本文件
- android - 如何将视图模型变量与自定义类类型绑定
- mysql - SQL中的存储过程具有不同语句的计数
- android - 当我从后台小部件中终止应用程序时停止
- angularjs - 仅使用JS获取一周内属于同一月份的天数
- c++ - 将向量堆叠成特征矩阵
- azure - Azure Blob 存储中的“缓存规则”选项卡消失了吗?