首页 > 解决方案 > 何时在实体 (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);

但这只是更大代码库中的一个小例子,看起来更像是我遗漏了一些东西。

任何帮助,将不胜感激。

标签: c#entity-framework-coreeager-loadingnavigation-properties

解决方案


推荐阅读