实体框架导航属性未加载

时间:2017-02-26 13:44:20

标签: c# entity-framework ef-code-first

我是Entity Framework的新手。我正在使用代码优先选项。下面我有一个基本模型。数据库是正确创建的,并且记录保持正确,但是当我第二次运行测试方法(在模型之后定义)时,我的标题记录加载正常,但我的导航属性Details不会重新加载。我做错了什么?

class Header
{
    public int HeaderId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Detail> Details { get; set; } = new List<Detail>();
}

class Detail
{
    public int DetailId { get; set; }
    public string Name { get; set; }
    public int HeaderId { get; set; }
    [ForeignKey("HeaderId")]
    public virtual Header Header { get; set; }
}

class MyContext : DbContext
{
    public MyContext() : base("EfTest")
    {
        this.Configuration.LazyLoadingEnabled = true;
    }

    public virtual DbSet<Header> Headers { get; set; }
}

private static void DoIt()
{
    using (var ctx = new MyContext())
    {
        var hdr = (
            from header in ctx.Headers
            where header.Name == NAME
            select header).FirstOrDefault();
        if (hdr == null)
        {
            hdr = new Header();
            hdr.Name = NAME;
            ctx.Headers.Add(hdr);
            MessageBox.Show("Header not found; created.");
        }
        else
        {
            MessageBox.Show("Header found!");
        }

        var det = hdr.Details.FirstOrDefault();
        if (det == null)
        {
            det = new Detail() { Name = "Hi" };
            hdr.Details.Add(det);
            MessageBox.Show("Detail not found; created.");
        }
        else
        {
            MessageBox.Show("Detail found!");
        }

        ctx.SaveChanges();
    }
}

1 个答案:

答案 0 :(得分:1)

此处实体框架使用Lazy-Loading。为了获取详细信息,您应该使用Eager-Loading。您应该在Include命名空间中使用System.Data.Entity方法来完成Eager-Loading。更改您的查询,如下所示。

       var hdr = (
                from header in ctx.Headers
                where header.Name == NAME
                select header).Include(h=>h.Details).FirstOrDefault();