2011-01-26 74 views
0

我有一个由具有导航属性的实体框架模型定义的对象,但是当导航属性为null时,实体框架似乎尝试从数据库中再次拉下来。现在情况良好,稍后我可以处理这个问题,但是当它试图从数据库中获取导航属性时,我从模型中得到错误:当EF尝试访问空属性时,关闭上下文

ObjectContext实例已经被处置,不能再被用于需要连接的操作。

好吧,这不是太好,它吹这样的块。我能做些什么来确保这只是在上下文仍处于打开状态时才会尝试?

提前致谢!

回答

2

您打开了延迟加载,但您已经处置了ObjectContext。要么不要这么快处理,要么turn off lazy loading

+0

谢谢你的快速反应!我希望我能保持语境的开放。但是,我无法控制的设计选择将不允许环境保持开放。另一个问题不是它是懒加载的,因为它试图在模型中使用非空ID来加载导航属性,但是该记录不存在,并且给我一个空导航属性。这适用于上下文打开的情况,但在随后的访问中,框架会尝试重新获取该属性,只有关闭了上下文。续... – khr055 2011-01-27 14:41:05

+0

我会在它上面放一个FK约束来防止这个问题发生,但这些对象来自包含另一个数据库表中的列的视图。任何其他想法? – khr055 2011-01-27 14:43:30

1

EF框架还支持'急切加载'。这意味着相关的实体将在相同的查询中返回。对于这个当然,你必须事先知道你需要哪些相关的实体,但这是一个我使用了很多的技术。 在你的情况下,可能值得一试。

这里是MSDN的相同的示例代码:(http://msdn.microsoft.com/en-us/library/bb896272.aspx)

// Define a LINQ query with a path that returns 
// orders and items for a contact. 
var contacts = (from contact in context.Contacts 
       .Include("SalesOrderHeaders.SalesOrderDetails") 
       select contact).FirstOrDefault();