entity-framework-core - EF Core返回空关系,直到直接访问

标签 entity-framework-core lazy-loading eager-loading

我有一些类似以下的模型:

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; }
}

OnModelCreatingDBContext中,我做了如下关系:
        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:

Null OriginalCode

但是,一旦我请求OriginalCode,如下所示:

OriginalCodes

那么突变体的OriginalCode字段将不为null:

Filled Object

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

最佳答案

原因在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/

相关文章:

c# - 多对多关系中的 EF Core Include()

angular - 延迟加载 Angular 解析器

php - Laravel 动态关系 - 在急切加载时访问模型属性

entity-framework - 如何在 Entity Framework Code First 中急切地包含实体的子元素和孙元素?

grails - Criteria查询中的Grails LazyClob

mysql - 在 Rails 3 中急切加载?

c# - 无法在 Windows 10 上安装 dotnet-ef 工具

c# - User类继承IdentityUser;如何处理多重继承的需要?

asp.net-core - 使用同一个类(模型)创建两个表

jquery - 延迟加载图片元素