实体框架核心中没有嵌套结果

时间:2017-03-04 13:30:34

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

我在使用EF的C#中有一个奇怪的行为 它是使用EF Core 1.1.0的.NET核心项目

"Microsoft.EntityFrameworkCore.SqlServer": "1.1.0",
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final",

我创建了两个模型," User"和" Group"

 public class User
 {
    public int Id { get; set; }
    public string name { get; set; }
    public string lastName { get; set; }

    public List<Group> Groups { get; set; }
 }

 public class Group
 {
    public int Id { get; set; }
    public string groupName { get; set; }
    public virtual User User { get; set; }
 }

结果可以给我一个用户列出他的小组。

现在奇怪的部分:

结果从DB返回,我查看allUser,Groups is Null

我会查看上下文以查看论坛

小组填补:

Groups are filled

现在我再次看看所有用户结果并神奇地 该组填写在每个用户项目中。

用户填写论坛:

Groups are filled inside User

我真的很感激任何帮助!

3 个答案:

答案 0 :(得分:5)

看起来你懒得加载实体。

您可以使用.Include急切加载它们。

 var allUsers = context.Users.Include(user => user.Groups).ToList();

此方法将第一个实体(用户)以及相关实体作为查询(组)的一部分加载。

答案 1 :(得分:0)

DbContext不会从数据库中下载实体,直到你没有这样做为止。在调试中单击context.Groups Results View时,DbContext将从数据库中获取所有组,之后它可以与用户关联。

我认为您正在搜索Include方法,您可以在一个查询中获取具有关联组的用户,如下所示:

var allUsers = context.Users.Include(u => u.Groups).ToList();

答案 2 :(得分:0)

此行为来自加载实体的懒惰。

默认情况下,您必须手动加载每个子实体。它被称为渴望加载。

为了急切加载您的实体,您必须在每个导航属性上使用.Include()方法。

e.g。 context.User.Include(x => x.Groups)

Include方法生成一个新的SQL语句,以便从数据库中检索您的组。

然后,您可以使用ToList()方法强制执行查询。