我有一个简单的模型,当我在调试器中运行网站时,实体框架没有正确填充模型。
模型很简单:
public class Team
{
/// <summary>
/// Constructor required for the EntityFramework to create the object.
/// </summary>
private Team()
{
}
public Team(string name, ApplicationUser owner)
{
Name = name;
Owner = owner;
}
[Required]
public int Id { get; private set; }
[Required]
public string Name { get; private set; }
[Required]
public ApplicationUser Owner { get; private set; }
[Required]
public List<TeamMembership> Members { get; set; }
}
public class TeamMembership
{
/// <summary>
/// Constructor for the EntityFramework
/// </summary>
private TeamMembership()
{
}
public TeamMembership(ApplicationUser user, MembershipStatus status)
{
User = user;
Status = status;
}
[Required]
public ApplicationUser User { get; private set; }
[Required]
public MembershipStatus Status { get; set; }
[Required]
public int Id { get; private set; }
}
其中ApplicationUser
是ASP MVC 5成员资格基础架构生成的默认类。
当我运行我的测试(Specflow)时,它为每个测试创建一个具有唯一ID的新LocalDb数据库,并在该数据库上运行迁移,然后实体框架正确填充我的团队和所有者。
但是,当我运行网站并尝试与应用程序进行交互时,我的团队未完全填充,因为所有者null
并且未填充Members
。但是在数据库中正确设置了所有者ID,并且查询似乎没问题。在测试期间执行的查询和应用程序的运行看起来都是一样的。
为什么会这样,我怎么开始调试这个问题?
我觉得我错过了一些简单的事情。
答案 0 :(得分:11)
您可能需要在查询中添加.Include()
,问题中没有显示,但看起来应该是这样的:
var query = context.Teams.Include(x => x.Owner).Include(x => x.Members).Where( ... );
EF只会加载顶级实体,但不会加载它所引用的实体(延迟加载)。如果您尚未处理上下文,只需尝试访问这些导航属性就会导致它们从数据库加载,但如果上下文已被处理,则不会发生这种情况。
.Include()
将通知EF,这些导航属性需要与引用实体一起急切加载。
有关延迟/急切加载以及如何控制它的详细信息,请参阅this MSDN page。