如何正确处理对象(ASP.NET MVC +实体框架)

时间:2012-02-03 15:39:32

标签: asp.net-mvc entity-framework garbage-collection dispose

我想知道在以下情况下如何正确处理对象。这是一个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);                              
}    

感谢

1 个答案:

答案 0 :(得分:2)

您的Task实体未作为原始查询的一部分进行检索,因此EF正在尝试延迟加载它,因为已经处理了上下文,所以它失败了。您应该使用Include()查询来检索Task实体作为原始查询的一部分,以避免以后必须返回到数据库(这也意味着您必须保持上下文的活动状态) )。

此外,您还没有在这里使用IoC,而是使用Service locator (Anti-) pattern。您应该将IoC容器作为构造函数依赖项传递到存储库中。反过来,IoC容器应负责存储库实例的生命周期管理。