实体框架子对象未填充

时间:2014-02-06 19:46:17

标签: entity-framework entity-framework-6

我有一个简单的模型,当我在调试器中运行网站时,实体框架没有正确填充模型。

模型很简单:

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,并且查询似乎没问题。在测试期间执行的查询和应用程序的运行看起来都是一样的。

为什么会这样,我怎么开始调试这个问题?

我觉得我错过了一些简单的事情。

1 个答案:

答案 0 :(得分:11)

您可能需要在查询中添加.Include(),问题中没有显示,但看起来应该是这样的:

var query = context.Teams.Include(x => x.Owner).Include(x => x.Members).Where( ... );

EF只会加载顶级实体,但不会加载它所引用的实体(延迟加载)。如果您尚未处理上下文,只需尝试访问这些导航属性就会导致它们从数据库加载,但如果上下文已被处理,则不会发生这种情况。

.Include()将通知EF,这些导航属性需要与引用实体一起急切加载。

有关延迟/急切加载以及如何控制它的详细信息,请参阅this MSDN page