实体框架 - ObjectContext 已释放的异常

6
我一直在调试这个程序,但是没有任何结果,很不幸我看不到问题的根源。我收到了这个异常:ObjectContext实例已经被处理并且无法用于需要连接的操作。
有两个表: - CustomerSet - OrderSet
Orders表中有一个名为Customer_id的字段确保表之间的关系,并且还有一个名为Customer的虚拟导航属性。
情景如下: 我向Orders表插入一个元素:
Order order = new Order();
Order.order_id = GenerateId(IdType.Order);
Order.date = DateTime.Now;
Order.Customer_id = GetCustomerId(tbCustomerName.Text);
Insert(order);

在Insert方法中,有一个DBContext在using语句中,因此它会在需要时自动释放。我在其中工作。

之后,我需要从先前插入的元素中获取数据(例如,我需要Customer字段的一些属性)。 现在,我希望Customer字段已经有值了:

Order o = GetOrder(order.order_id);

我在客户字段中遇到了一个异常:o.Customer threw an exception of type 'System.ObjectDisposedException'。

我正在尝试使用延迟加载,开启或关闭它,但是没有起作用。情况仍然相同...

我弄得一团糟了吗?

真正好的是,如果我使用F11逐步执行,它经常能够正确运行!

请帮忙解决!提前感谢。


你需要发布一些代码的更多细节,如果不知道何时以及如何获取DbContext对象,就无法知道发生了什么。 - Jamie Treworgy
2个回答

6
在Insert方法中,使用using语句创建了DBContext对象,所以在需要时会自动释放该对象。
并不是完全“需要时”。它会在using块的作用域结束时立即调用上下文对象的IDisposable.Dispose()。
之后,我需要访问先前插入的元素的数据。
此时,您的上下文被释放了。如果您的操作需要惰性加载,则会失败,因为上下文不可用于执行惰性加载。
如果您通常需要访问尚未加载的对象,则最有效的方法可能是使用.Include在检索其余对象图时将其加载 。这称为急切加载。
如果您偶尔需要访问未加载的对象,则需要一个新的上下文。
关于加载相关对象的讨论,我建议。

http://msdn.microsoft.com/en-us/data/jj574232.aspx


1
嗯,这个.Include成功解决了问题。很棒的函数。非常感谢你! - Mitulát báti

0

如果您在Insert内部使用语句,那么上下文就消失了。

只要您确保Insert()的一部分是order.order_id获取新Id,并且GetOrder()启动一个新上下文,那么这就没问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接