2011-06-10 79 views
4

我有父对象和子对象。如果我做以下操作插入后的延迟加载属性

Child c = new Child(); 

c.ParentID = parentID; 
context.Child.Add(c); 
context.SaveChanges(); 

int i = c.Parent.ParentID; // throws an exception b/c Parent is null 

为什么这样做?如果我得到一个新的上下文(保存后),我可以看到父母很好。

+0

您是先使用EF 4.1代码吗? – Eranga 2011-06-10 23:28:27

+0

不。我们使用EF,但不是先编码。 – user472292 2011-06-12 18:23:15

+0

可能的重复[Entity Framework:我设置外键,SaveChanges然后访问导航属性,但它不加载相关的实体。为什么不?](http://stackoverflow.com/questions/15552891/entity-framework-i-set-the-foreign-key-savechanges-then-access-the-navigation) – 2014-05-07 12:45:58

回答

9

我想你正在启用延迟加载。如果你想与外键属性的情况下添加对象后,该导航属性被填充,你必须使用DbSetCreate方法(而不是实例与new对象):

Child c = context.Child.Create(); 

在主动延迟加载这将创建一个代理对象,确保导航属性被加载。

+0

这解释了为什么当我读到的所有内容都显示它应该正常工作时,我无法导航到任何父级导航属性。谢谢。 – AdamH 2012-04-19 22:23:49

+0

@Slauma这很好,谢谢。但是如果我的Child对象有一个具有所需值的构造函数,我该如何使用Create()方法?例如通常我会做Child c = new Child(OtherObject o)。显然context.Child.Create(o)不起作用。 – Jordan 2013-07-08 17:30:59

+0

@Jordan:这是不可能的。 'Create'只能通过默认的构造函数实例化一个实体。你必须在调用'Create'后设置实体属性(或者调用类似于你传递参数的'Init'方法)。 – Slauma 2013-07-08 17:57:02