2017-03-28 57 views
0

我试图与实体框架和代码优先实现简单的一对多关系。 我设置一个简单的方法我的父类:实体框架 - 将子对象添加到父项

public class Parent 
{ 
    [Key] 
    public long ParentId { get; set; } 
    public ICollection<Child> Child { get; set; } 

    public Parent() 
    { 
     Child = new HashSet<Child>(); 
    } 
} 

当然,这是一个简化版本。 我的子类是父那样简单:

public class Child 
{ 
    [Key] 
    public long ChildId { get; set; } 
    public int ParentId { get; set; } 
    public virtual Parent parent { get; set; } 
} 

我的控制器是由EF生成的。 问题是,当我在post方法中创建一个具有父级ID的子级时,该ID在数据库中设置,但是当我获得父级时,子级列表为空。

我已经尝试添加父的孩子在控制器像这样:

db.parent.find(child.parentId).Child.Add(child); 

这显然是没有效果的。

子对象中的父项为空,父项中的子项列表为空。

我怎样才能得到父母的收藏中的孩子?

谢谢!

+1

你叫context.SaveChanges()? – amyn

+1

您需要将您的“儿童”属性更改为“public virtual ICollection Child {get;组; }' –

+0

嗨! 感谢您的关注,我确实打电话给SaveChanges()。 并添加虚拟没有帮助我的问题。我可能会补充说,我关闭了代理创建,以便序列化结果。 感谢您的编辑了。 –

回答

1

据我所知,禁用代理创建也会影响延迟加载。延迟加载只能在代理类中使用。如果没有,那么当您访问属性时,EF无法控制。

你可以得到孩子的唯一方法是使用预先加载(使用包括())

+0

嗨,谢谢你的回答! 我试图包括孩子,但问题是一样的。 我认为问题在于孩子不是在父母中设置的,而是仅仅是获取它。 –

+1

没有创建代理,您将不会有延迟加载功能。这意味着myParent.Child(以及myChild.Parent)永远不会被EF填充。你需要明确地将它们添加到数据库调用中:db.Parent.Include(m => m.Child).SingleOrDefault(m => m.Id == myId)例如) – jparaya