【问题标题】:Entity Framework Core: Include does not load relations in a fully defined relationshipEntity Framework Core:Include 不会在完全定义的关系中加载关系
【发布时间】:2020-08-20 05:25:27
【问题描述】:

给定以下三个类:

public class Make
{
    public int MakeId { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public ICollection<Model> Models { get; set; }

    public Make()
    {
        Models = new Collection<Model>();
        Name = string.Empty;
    }
}
public class Model
{
    public int ModelId { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public Make Make { get; set; }
    public int MakeId { get; set; }

    Model()
    {
        Name = string.Empty;
        Make = new Make();
    }
}
public class VegaDbContext : DbContext
{
    public VegaDbContext(DbContextOptions<VegaDbContext> options) : base(options)
    {

    }
    public DbSet<Make> Makes { get; set; }
    public DbSet<Model> Models { get; set; }
}

我想提供一个返回 Make 和相关模型的 API 端点。其功能如下所示:

[HttpGet("/api/makes")]
public async Task<IEnumerable<MakeResource>> GetMakes()
{
    // Here Models is not being loaded!
    var makes = await dbContext.Makes.Include(m => m.Models).ToListAsync();

    // This is manually loading the required data, which works. But I don't want to do this.
    foreach (var make in makes)
    {
        make.Models = await dbContext.Models.Where(m => m.MakeId == make.MakeId).ToListAsync();
    }

    // This mapper part is not of interest
    return mapper.Map<IList<Make>, IList<MakeResource>>(makes);
}

这里的问题是,获取 Makes 的行不包括 Models,而是得到一个空列表。根据Microsoft's documentation,这是一个“完全定义的关系”,应该加载具有正确外键的模型。

似乎随着 EFC 3.0 的引入而发生了一些变化,而且似乎以前也有效。我不知道为什么会这样。如果有人有想法,我会很高兴!该数据库是使用代码优先迁移创建的。版本是:

.NET Core SDK (reflecting any global.json):
 Version:   3.1.103
 Commit:    6f74c4a1dd

Runtime Environment:
 OS Name:     manjaro
 OS Version:  
 OS Platform: Linux
 RID:         arch-x64
 Base Path:   /usr/share/dotnet/sdk/3.1.103/

Host (useful for support):
  Version: 3.1.3
  Commit:  ed88943d24

.NET Core SDKs installed:
  3.1.103 [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

数据库中填满了:

【问题讨论】:

  • 你在哪里为实体配置了PK-FK关系?就像在OnModelCreating() 回调中一样
  • 当我使用默认约定时,EF 在创建迁移时会自动检测到这一点。如果它检测到创建迁移而不是查询,那会很奇怪,还是我在这里弄错了?
  • 我还有两个关于Model 类的问题:1)为什么它的构造函数是私有的(错字?)为什么你有Make = new Make(); 行?
  • 这里是配置控制台记录器的链接stackoverflow.com/a/53693858/3579354
  • JFYI @Muqq,我能够重现内存提供者的问题,注释掉 Make = new Make() 帮助 =)))

标签: c# .net-core entity-framework-core


【解决方案1】:

我能够重现 EF Core In-Memory Database Provider 的问题,在 Model 构造函数中注释掉行 Make = new Make(); 解决了问题。

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2010-09-15
    • 2017-09-26
    相关资源
    最近更新 更多