gpt4 book ai didi

c# - EF Core 返回空关系,直到直接访问

转载 作者:行者123 更新时间:2023-12-05 07:44:31 25 4
gpt4 key购买 nike

我有一些像下面这样的模型:

public class Mutant
{
public long Id { get; set; }
...

// Relations
public long OriginalCodeId { get; set; }
public virtual OriginalCode OriginalCode { get; set; }
public int DifficultyLevelId { get; set; }
public virtual DifficultyLevel DifficultyLevel { get; set; }
}

public class OriginalCode
{
public long Id { get; set; }
...

// Relations
public virtual List<Mutant> Mutants { get; set; }
public virtual List<OriginalCodeInputParameter> OriginalCodeInputParameters { get; set; }
}

DBContextOnModelCreating 中,我建立了如下关系:

        modelBuilder.Entity<Mutant>()
.HasOne(m => m.OriginalCode)
.WithMany(oc => oc.Mutants)
.HasForeignKey(m => m.OriginalCodeId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);

modelBuilder.Entity<Mutant>()
.HasOne(m => m.DifficultyLevel)
.WithMany(dl => dl.Mutants)
.HasForeignKey(m => m.DifficultyLevelId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);

现在当我请求 Mutants 时,OriginalCode 为空:

Null OriginalCode

但只要我请求如下所示的 OriginalCode:

OriginalCodes

然后突变体的OriginalCode字段将不为空:

Filled Object

是什么原因,我该如何解决?

最佳答案

原因在 Loading Related Data 中解释。 EF Core 文档的一部分。

第一个行为是因为 EF Core 当前不支持延迟加载,因此通常您将获得导航属性的 null,直到您通过预先加载或显式加载专门加载它们。但是,Eager loading 部分包含以下内容:

Tip
Entity Framework Core will automatically fix-up navigation properties to any other entities that were previously loaded into the context instance. So even if you don't explicitly include the data for a navigation property, the property may still be populated if some or all of the related entities were previously loaded.

这解释了为什么在第二种情况下导航属性不为 null。

现在,我不确定你想修复这两种行为中的哪一种,所以我会尝试解决这两种行为。

第一个行为可以通过使用当前可用的方法之一来“修复”以加载相关数据,例如预加载:

var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();

第二种行为是“设计使然”的,无法控制。如果你想避免它,确保使用全新的 DbContext 实例来执行单个查询来检索所需的数据,或者使用 no tracking query .

更新:从 v2.1 开始,EF Core 支持 Lazy Loading .但是默认情况下不启用它,因此为了利用它,应该将所有导航属性标记为 virtual,安装 Microsoft.EntityFrameworkCore.Proxies并通过 UseLazyLoadingProxies 调用启用它,或使用 Lazy-loading without proxies - 两者都在 EF Core 文档中用示例进行了解释。

关于c# - EF Core 返回空关系,直到直接访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42828592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com