EF Core:一对多并不渴望加载

时间:2019-01-15 20:46:31

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

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

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中设置了“通用”模式:

modelBuilder.HasDefaultSchema("common");

Console Logging

1 个答案:

答案 0 :(得分:1)

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

using System.Data.Entity;

使用该名称空间,.include语句已正确编译,但是EFCore并未拾取关系。添加:

using Microsoft.EntityFrameworkCore;

突然之间,SQL为正确的负载正确生成了联接。