【问题标题】:Context is closed when EF tries to access null property当 EF 尝试访问 null 属性时,上下文关闭
【发布时间】:2011-01-26 21:32:40
【问题描述】:

我有一个由我的实体框架模型定义的具有导航属性的对象,但是每当导航属性为空时,实体框架似乎会尝试再次从数据库中将其拉下。现在这很好,我可以稍后解决这个问题,但是当它尝试从数据库中获取导航属性时,我从模型中得到错误:

ObjectContext 实例已被释放,不能再用于需要连接的操作。

嗯,这不是太好,它会像这样吹大块。我能做些什么来确保仅在上下文仍然打开时才尝试这样做?

提前致谢!

【问题讨论】:

    标签: c# asp.net sql-server entity-framework


    【解决方案1】:

    您已开启延迟加载,但您已处置您的 ObjectContext。要么不要这么快处理它,要么turn off lazy loading

    【讨论】:

    • 感谢您的快速回复!我希望我可以保持上下文开放。但是,我无法控制的设计选择不允许上下文保持打开状态。另一个问题也不是它是延迟加载的,因为它尝试使用模型中的非空 Id 加载导航属性,但是记录不存在给我一个空导航属性。这对于上下文打开时很好,但在后续访问时,框架会尝试再次获取属性,只有在上下文关闭的情况下。继续...
    • 我会对其施加 FK 约束,以防止整个问题首先发生,但对象来自包含另一个数据库中表的列的视图。还有其他想法吗?
    • 如果您关闭延迟加载,框架将不会“尝试再次获取属性”。
    【解决方案2】:

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

    【讨论】:

    • 急切加载并不能解决他的问题,除非您急切加载所有可能的关联,并且具有无限的深度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多