2013-03-11 39 views
1

我有一个class称为第同类型的的EntityFramework 5 CodeFirst儿童家长不更新/保存

public class Section 
{ 
    public Section() { construct(0); } 
    public Section(int order) { construct(order); } 
    private void construct(int order) 
    { 
     Children = new List<Section>(); 
     Fields = new List<XfaField>(); 
     Hint = new Hint(); 
     Order = order; 
    } 

    [Key] 
    public int Id { get; set; } 

    public int FormId { get; set; } 

    public string Name { get; set; } 

    [InverseProperty("Parent")] 
    public List<Section> Children { get; set; } 

    public List<XfaField> Fields { get; set; } 

    public Section Parent { get; set; } 

    public Hint Hint { get; set; } 

    public int Order { get; private set; } 


    #region Methods 
    public void AddNewChild() 
    { 
     AddChild(new Section 
     { 
      Name = "New Child Section", 
      FormId = FormId, 
     }); 
    } 
    private void AddChild(Section child) 
    { 
     child.Parent = this; 

     if (Children == null) Children = new List<Section>(); 

     int maxOrder = -1; 
     if(Children.Count() > 0) maxOrder = Children.Max(x => x.Order); 

     child.Order = ++maxOrder; 

     Children.Add(child); 

     FactoryTools.Factory.PdfSections.Add(child); 
    } 
    // Other methods here 
    #endregion 
} 

我想一个新的子Section添加到这样一个已经存在的父:

private void AddChildSection() 
    { 
     var parent = FactoryTools.Factory.PdfSections.FirstOrDefault(x => x.Id == ParentId); 

     if (parent == null) throw new Exception("Unable to create child because parent with Id " + ParentId.ToString() + " doesn't exist."); 

     parent.AddNewChild(); 

     FactoryTools.Factory.SaveChanges(); 
    } 

当我看着数据库,我看到新行已添加,因此,例如:

Id Name    Parent_Id Hint_Id FormId Order 
19 New Child Section 1   27  1  0 

然而,当我加载的父Section,将Children属性始终的Count 0,如下:

public ActionResult EditSection(int formId, int sectionId) 
    { 
     var model = FactoryTools.Factory.PdfSections.FirstOrDefault(x => x.Id == sectionId); 

     if (model == null || model.FormId != formId) model = new Section(); 

     //model.Children = FactoryTools.Factory.PdfSections.Where(x => x.Parent.Id == sectionId).ToList(); 

     return PartialView(model); 
    } 

当然,当我手动添加孩子,那么它们的存在(在上面的代码,通过取消注释model.Children = ...线)

我习惯于NHibernate的做事方式,因此非常沮丧,上述看似简单的任务不在EntityFramework中工作,我做错了什么?

回答

2

实体框架不会急于加载相关实体。尝试迫使它包括孩子:

var model = FactoryTools.Factory.PdfSections.Include("Children").FirstOrDefault(x => x.Id == sectionId); 

还有一个强类型的过载,你可以通过一个lambda:

var model = FactoryTools.Factory.PdfSections.Include(s => s.Children).FirstOrDefault(x => x.Id == sectionId); 
+0

什么总成让我获得了强类型的版本? – 2013-03-11 05:53:12

+0

Nm,刚刚找到它'System.Data.Entity' – 2013-03-11 05:56:34