实体框架- objectcontext处理异常

本文关键字:处理 异常 objectcontext 框架 实体 | 更新日期: 2023-09-27 18:04:45

我一直在调试这个程序,没有任何结果,不幸的是我看不到问题的根源。我得到这个异常:ObjectContext实例已被处理,不能再用于需要连接的操作。

有2个表:——CustomerSet——OrderSet

Orders表中名为Customer_id的字段确保了表之间的关系,并且在Orders表中也有一个名为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方法中,using语句中有DBContext,因此它在需要时自动删除。我在里面工作。

之后,我需要来自先前插入的元素的数据(例如,我需要Customer字段的一些属性)。现在我希望Customer字段得到value:

Order o = GetOrder(order.order_id);

我在Customer字段中得到了一个异常:o.Customer抛出了一个类型为'System '的异常。ObjectDisposedException '

我在玩懒惰加载,打开或关闭它,但我没有工作。情况是一样的……

我搞砸了什么?

真正的好处是,如果我一步一步地用F11,它经常正常工作!

请帮忙!

实体框架- objectcontext处理异常

在Insert方法中,using语句中有DBContext,因此它会在需要时自动删除

不完全是"必要时"。一旦超出using块的作用域,它就在上下文对象上调用IDisposable.Dispose()

之后,我需要之前插入的元素

的数据

您的上下文此时已被处理。如果您的操作需要延迟加载,则会失败,因为上下文不可用于执行延迟加载。

如果您通常需要访问尚未加载的对象,最有效的方法可能是在检索对象图的其余部分时使用.Include来加载它。

如果你在加载对象图的其他部分时,偶尔需要访问一个没有加载的对象,你就需要一个新的上下文。

对于加载相关对象的讨论,我建议使用

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

如果在Insert中有using语句,那么上下文就消失了。

只要你确保作为Insert()的一部分order.order_id获得新的Id并且GetOrder()触发一个新的上下文

就可以了