我在使用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
我会查看上下文以查看论坛
小组填补:
现在我再次看看所有用户结果并神奇地 该组填写在每个用户项目中。
用户填写论坛:
我真的很感激任何帮助!
答案 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()
方法强制执行查询。