c# - 何时在实体 (EF Core 3.1) 上初始化导航属性?
问题描述
我有一个场景,我在禁用延迟加载的情况下将相当多的相关实体插入到数据库中。在一种情况下,我初始化实体,然后将其插入:
// SomeObj is an entity with an identity specification in its primary key column.
var obj = new SomeObj
{
SomeTypeId = 1,
SomeOtherTypeId = 185,
};
context.SomeObjs.Add(obj);
context.SaveChanges();
我注意到的是,在我的应用程序的上下文中,当这种情况发生时SomeOtherType
(作为外键的导航属性SomeOtherTypeId
)被初始化而SomeType
没有被初始化。
两个导航属性都使用 FluentAPI 以相同的方式定义:
entity.HasOne(d => d.SomeType)
.WithMany(p => p.SomeObjs)
.HasForeignKey(d => d.SomeTypeId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_SomeObj_SomeType");
entity.HasOne(d => d.SomeOtherType)
.WithMany(p => p.SomeObjs)
.HasForeignKey(d => d.SomeOtherTypeId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_SomeObj_SomeOtherType");
我跳进 LINQPad 看看是否可以在插入时重现导航属性的半初始化,但我不能。SomeObj
在 LINQPad 中插入单个类型的实体会导致没有导航属性被初始化(这似乎比其中一半被初始化更合理)。
所以这让我想知道:EF Core 3.1 中的导航属性实际上是什么时候初始化的?如上所述,延迟加载被禁用(这就是为什么所有导航属性都为空对我来说是合理的)。
我可以通过以下插入来解决此问题:
obj = context.SomeObjs
.Include(o => o.SomeType)
.Include(o => o.SomeOtherType)
.First(o => o.Id == obj.Id);
但这只是更大代码库中的一个小例子,看起来更像是我遗漏了一些东西。
任何帮助,将不胜感激。
解决方案
推荐阅读
- node.js - Socket.io + Redis - 客户端正在加入彼此的“私人”房间
- ruby-on-rails - 从 docker 容器 ruby on rails 应用程序连接本地 mongodb
- swift - 将字符串格式化为 Pascal 大小写
- windows - 如何将文本文件设置为由批处理脚本更改并输出到 .txt 并擦除原始文本文件的内容?
- perl - 是否可以确定 Perl Mason 请求的 SSL/TLS 版本?
- google-chrome - Google Chrome 设备框架在打开时不可见
- angular - 错误:无法解析 MyProvider 的所有参数:([object Object], [object Object], ?, [object Object])
- python - 没有归一化的 matplotlib 颜色图
- spring-boot - SpringBoot 从 IntelliJ 工作,但从 JAR 抛出 java.lang.NoSuchMethodError
- python - Python - 编写原始 SQL 以在 Python 中操作数据帧