为什么“Dispose”有效,但“use(vardb=newDataContext())”无效?我正在创建一个由主题组成的论坛,主题由消息组成。当我尝试在控制器中实现主题视图时:publicActionResultTopic(intid)//TopicId{using(vardb=newDataContext()){vartopic=db.Topics.Include("Messages").Include("Messages.CreatedBy").Include("CreatedBy").FirstOrDefault(x=>x.Id==id);//包括每个主题的消息,以及它们的创建时间,以便最后一条消息可以显示在主题页面上returntopic!=null?视图(主题):视图();我在尝试查看主题页面时收到此错误:用户代码未处理ObjectDisposedExceptionObjectContext实例已被处理,不能再用于需要连接的操作。该错误似乎并不特定于某一行,因为当我删除有问题的行时,之前发生了同样的错误。我解决了这个问题:DataContextdb=newDataContext();在控制器的开头和:protectedoverridevoidDispose(booldisposing){db.Dispose();base.Dispose(处置);最后(和使用)虽然这有效,但我很好奇为什么“使用”不起作用,我真的很乐意在整个控制器中打开连接并在最后手动处理它。您的任何实体是否启用了延迟加载?看起来在您的视图中执行了一些查询,但是您在执行之前处理了上下文(因此错误说它已经被处理了)。如果将处理放在控制器的Dispose方法中,视图将在控制器和上下文被释放之前执行。我建议安装Glimpse.Mvc5和Glimpse.EF6包。配置glimpse后,您可以看到页面中执行的每个查询。您可能会惊讶地看到您不打算执行的其他一些查询。这就是为什么我不建议您直接在视图中使用实体。这是因为LINQ实体通常是代理对象。如果您有类似MyEntity.ChildEntities的内容,则在执行代码之前将不会执行底层SQL查询来获取这些对象。如果您在视图中访问它们,则在操作方法返回之前不会绑定视图,此时DbContext已被释放。生命周期如下所示:调用操作方法获取主题的外部查询运行,但视图中触发更多SQL查询的任何其他访问器尚未执行。我们现在离开了action方法,所以使用我们刚刚处理的DbContext。MVC框架将模型绑定到视图,这会触发任何剩余的查询实际执行并由于DbContext被释放而失败。请求生命周期即将结束,因此控制器已完成处理。这是有关延迟加载实体的重要资源。这是延迟加载的一个问题,所以感谢@Dismissile的正确指导一旦我使用'.Include'加载主题的每个虚拟属性,它工作正常:vartopic=db.Topics.Include("Messages")。Include("Messages.CreatedBy").Include("CreatedBy").Include("论坛").Include("DeletedBy").FirstOrDefault(x=>x.Id==id);抱歉,我想,任何人都不可能知道我正在声明哪些属性是虚拟的。顺便说一句,它在我检查调试模式下的属性之前工作,因为必须加载每个属性才能检查它你不能使用上下文返回视图或其他东西,因为这会导致处理上下文的问题这里。在您的案例中使用using语句的正确方法是publicActionResultTopic(intid)//TopicId{Topictopic=null;//主题是你的POCO使用(vardb=newDataContext()){topic=db.Topics.Include("Messages").Include("Messages.CreatedBy").Include("CreatedBy").FirstOrDefault(x=>x.Id==id);}返回主题!=null?视图(主题):视图();如果不响应using语句中的重定向..看这里:在MVC中使用using语句处理数据库上下文以上是C#学习教程:为什么“Dispose”有效,但“use”无效(vardb=新数据上下文())”?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
