我想知道在以下情况下如何正确处理对象。这是一个ASP.NET MVC控制器操作。有一个实现IDisposable的存储库。附件实体包含相关实体任务。当我单击附件详细信息时,它会正确显示。但是,当我单击该任务时,以下异常抛出“ObjectContext实例已被释放...”。我理解,当渲染视图时,它被处理掉并且ObjectContext被关闭。
public ActionResult Detail(Guid id)
{
Attachment attachment = null;
using (var attachmentRepository = IoC.Resolve<AttachmentRepository>())
{
attachment = attachmentRepository.SelectByKey(id);
return View("Detail", attachment);
}
}
我的问题是这种情况下的最佳做法是什么?
这是一个很好的解决方案吗?什么时候会在这种情况下处理ObjectContext?当用户转到另一个视图?或者当垃圾收集器被执行时?
public ActionResult Detail(Guid id)
{
Attachment attachment = null;
var attachmentRepository = IoC.Resolve<AttachmentRepository>();
attachment = attachmentRepository.SelectByKey(id);
return View("Detail", attachment);
}
感谢
答案 0 :(得分:2)
您的Task
实体未作为原始查询的一部分进行检索,因此EF正在尝试延迟加载它,因为已经处理了上下文,所以它失败了。您应该使用Include()
查询来检索Task
实体作为原始查询的一部分,以避免以后必须返回到数据库(这也意味着您必须保持上下文的活动状态) )。
此外,您还没有在这里使用IoC,而是使用Service locator (Anti-) pattern。您应该将IoC容器作为构造函数依赖项传递到存储库中。反过来,IoC容器应负责存储库实例的生命周期管理。