我一直在调试这个程序而没有任何结果,不幸的是我无法看到问题的根源。我得到了这个异常: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领域有价值:
Order o = GetOrder(order.order_id);
我在Customer字段中得到了一个例外:o.Customer抛出了'System.ObjectDisposedException'类型的异常
我正在玩懒惰的装载,打开或关闭,但我没有锻炼。情况是一样的......
我该怎么做?
真正的好处是,如果我一步一步地使用F11,它通常可以正常工作!
请帮忙!提前谢谢。
答案 0 :(得分:5)
在Insert方法中,在using语句中有DBContext,因此它在需要时自动处理
不完全“需要时”。一旦超出IDisposable.Dispose()
块的范围,它就会在上下文对象上调用using
。
之后,我需要先前插入的元素
中的数据
此时您的上下文已被处理。如果您的操作需要延迟加载,那么将失败,因为上下文不可用于执行延迟加载。
如果您通常需要访问尚未加载的对象,则最有效的方法可能是在检索对象图的其余部分时使用.Include
加载它。这被称为急切加载。
如果您在加载对象图的其余部分时偶尔需要访问未加载的对象,则需要新的上下文。
关于加载相关对象的讨论,我建议
答案 1 :(得分:0)
如果Insert
中有使用声明,则上下文消失。
只要您确保Insert()
order.order_id
的一部分获得新ID并且GetOrder()
启动新的上下文