EF Core:一对多不是急于加载
EF Core: one to many isn't eager loading
鉴于Post的对象模型有很多Post翻译,我设置了两个对象:
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; }
}
在我的上下文 class 中,在 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() 中的变量后,翻译就会在那里。 'common' 架构在模型构建器中设置:
modelBuilder.HasDefaultSchema("common");
事实证明,这是一个命名空间问题。这是一个重构的存储库,在它的顶部,有:
using System.Data.Entity;
使用该命名空间,.Include 语句被正确编译,但 EFCore 没有选择关系。添加:
using Microsoft.EntityFrameworkCore;
然后 SQL 突然为预加载正确生成连接。
鉴于Post的对象模型有很多Post翻译,我设置了两个对象:
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; }
}
在我的上下文 class 中,在 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() 中的变量后,翻译就会在那里。 'common' 架构在模型构建器中设置:
modelBuilder.HasDefaultSchema("common");
事实证明,这是一个命名空间问题。这是一个重构的存储库,在它的顶部,有:
using System.Data.Entity;
使用该命名空间,.Include 语句被正确编译,但 EFCore 没有选择关系。添加:
using Microsoft.EntityFrameworkCore;
然后 SQL 突然为预加载正确生成连接。