【问题标题】:Entity framework - objectcontext disposed exception实体框架 - objectcontext 处理异常
【发布时间】:2013-03-07 07:23:34
【问题描述】:

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

有 2 个表: - 客户集 - 订单集

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);

我得到了这个 o,但在 Customer 字段中有一个异常:o.Customer 抛出了“System.ObjectDisposedException”类型的异常

我正在玩延迟加载,打开或关闭它,但我没有解决。情况是一样的……

我要搞砸什么?

真正的好处是,如果我一步一步按 F11,它通常可以正常工作!

请帮忙!提前谢谢你。

【问题讨论】:

  • 您需要发布代码的更多详细信息,但不知道如何以及何时获取 DbContext 对象,就不可能知道发生了什么。

标签: c# frameworks entity objectcontext objectdisposedexception


【解决方案1】:

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

不完全是“在需要时”。一旦超出using 块的范围,它就会在上下文对象上调用IDisposable.Dispose()

之后,我需要来自之前插入的元素的数据

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

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

如果您在加载对象图的其余部分时偶尔需要访问未加载的对象,则需要一个新的上下文。

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

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

【讨论】:

  • 嗯,这个 .Include 成功解决了问题。很酷的功能。非常感谢!
【解决方案2】:

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

只要您确保 Insert() 的一部分 order.order_id 获得新的 Id 并且 GetOrder() 启动新的上下文就可以了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2015-06-27
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多