【问题标题】:EF Core: one to many isn't eager loadingEF Core:一对多不是急切加载
【发布时间】:2019-01-15 20:46:30
【问题描述】:

鉴于 Post 的对象模型有很多 PostTranslation,我设置了两个对象:

public partial class Post{
    public Post()   {
        PostTranslations = new HashSet<PostTranslation>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<PostTranslation> PostTranslations { get; set; }
}

public partial class PostTranslation {
    public int Id { get; set; }
    public string Title { get; set; }
    public int PostId { get; set; }
    public Post Post { get; set; }
}

在我的上下文类中,在 OnModelBuilding 中,我有以下内容:

modelBuilder.Entity<Post>(entity => {
    entity.ToTable("Posts");
    entity
    .HasMany<PostTranslation>(x => x.PostTranslations)
    .WithOne(g => g.Post)
    .HasForeignKey(g=>g.PostId);
});

在我的存储库中,我调用以下代码:

db.Posts.Include(t=>t.PostTranslations).ToList();

但是在检查生成的 SQL 时,PostTranslations 从未加入,并且 Post 对象上的哈希集始终为零。有翻译,它们在数据库中正确连接。如果我直接查询它们,我可以从数据上下文中获取 PostTranslations。但我似乎无法让 EFCore 使用简单的 .Include 语句急切加载它们。

我错过了什么?

编辑 生成的 SQL 是这样的:

SELECT [f].[Id],  [f].[Name] FROM [common].[Posts] AS [f]

我预计会看到 PostTranslations 的左连接,所以在我迭代 ToList() 中的变量后,翻译就会在那里。并且在模型构建器中设置了“通用”模式:

modelBuilder.HasDefaultSchema("common");

【问题讨论】:

  • 一切看起来都不错。在主要的Posts 查询之后,必须有第二个查询来加载PostTranslations。希望代码如图所示,例如您没有在构造函数中设置 PostTranslation.Post 属性或在构造函数/导航属性 getter setter 等中做其他花哨的东西吗?
  • 你确定这里只执行了一个 SQL 查询吗?正如 Ivan 所说,这将通过 2 个不同的 SELECT 语句来实现。
  • @mxmissile 这是 EF Core 处理加载相关子集合的方式(每个集合一个查询)。这是与 EF6 单一联合查询不同的方法。
  • @mxmissile 与 EF6 中的相同 - 在具体化结果中加载(包含)相关数据。只是实现不同。
  • @IvanStoev 谢谢你的澄清

标签: c# asp.net-core ef-core-2.1


【解决方案1】:

事实证明,这是一个命名空间问题。这是一个重构的存储库,在它的顶部,有:

using System.Data.Entity;

使用该命名空间,正确编译了 .Include 语句,但 EFCore 没有拾取关系。添加:

using Microsoft.EntityFrameworkCore;

突然间,SQL 正在为急切加载正确生成连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多