2012-02-03 63 views
2

我想知道如何在下列情况下正确处理对象。这是一个ASP.NET MVC控制器操作。有一个实现IDisposable的仓库。附件实体包含相关的实体任务。当我点击附件详细信息时,它显示正确。但是当我点击这个任务时,下面的异常抛出:“ObjectContext实例已经被处置...”。我明白,当视图呈现时,它被放置并且ObjectContext被关闭。如何正确处理对象(ASP.NET MVC +实体框架)

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

感谢

回答

2

Task实体并没有恢复成原始查询的一部分,所以EF试图延迟加载它,因为上下文已被释放其失败。您应该使用Include()查询来检索Task实体作为原始查询的一部分,以避免稍后再回到数据库(这也意味着您必须保持该上下文保持活动状态)。

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

+1

由于__BrokenGlass__说你应该使用'Include'来加载实体,我猜想一个ViewModel会更好地将你的数据传递给View。这里有一些很好的理由说明为什么你不应该在视图中延迟加载你的数据:http://nhprof.com/learn/alerts/QueriesFromViews – Andreas 2012-02-03 15:51:37