我有一些类似以下的模型:
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; }
}
在
OnModelCreating
的DBContext
中,我做了如下关系: 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
字段将不为null:原因是什么,我该如何解决?
最佳答案
原因在EF Core文档的Loading Related Data部分中进行了说明。
第一个行为是因为EF Core当前不支持延迟加载,因此通常您将获得导航属性null
,直到通过急切或显式加载专门加载它们为止。但是, Eager加载部分包含以下内容:
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
实例用于执行单个查询以重试所需的数据。更新: EF Core从v2.1开始,支持Lazy Loading。但是默认情况下未启用它,因此要使用它,应标记所有导航属性
virtual
,安装Microsoft.EntityFrameworkCore.Proxies并通过UseLazyLoadingProxies
调用启用它,或使用Lazy-loading without proxies-两者均在EF Core文档中通过示例进行了说明。
关于entity-framework-core - EF Core返回空关系,直到直接访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42327515/