MVC和实体框架何时处理实体对象

时间:2011-05-18 17:23:16

标签: asp.net-mvc entity-framework

什么时候在实体框架和MVC中处理 Entities对象上下文对象?

例如,如果我有一个人员表并且我在控制器方法中选择一个记录,将其丢弃并将其传递回我的视图,那么该记录将无法在视图中使用。

处理完视图后,我应该以某种方式处理它吗?或者根本不处理它?<​​/ p>

3 个答案:

答案 0 :(得分:1)

一种选择是在Global.asax的begin request事件中创建它,并将其丢弃在Global.asax的结束请求事件中。每个页面只使用那个(在HttpContext.Current.Items中或在线程本地存储中存储和获取)而不处理它。这使得您的视图可以进行延迟加载,但在请求完成后仍然可以处理它。

另一个选项是在调用视图之前确保已经加载了所有内容(通过.First(),. ToList()和.Include(property)以包含导航属性数据)并立即处理它。这两种方法都有效。

答案 1 :(得分:0)

我假设您正在谈论处理实体框架“上下文”,因为对象本身不是一次性的。

我们发现最好将实体本身留在我们的数据层中,并将它们映射到包含给定视图所需的所有信息的POCO / DTO。这样我们就不会在渲染视图时尝试延迟加载数据。我们将数据访问代码包装在using(var context = contextFactory.Get())中,以便在方法结束之前自动处理上下文,但是在我们将所有数据加载到内存中的集合之后。

答案 2 :(得分:0)

让我们考虑用户的典型使用模式,你永远不会只打开一个项目而离开,事实上我们在项目之间来回移动,再次搜索和审查项目,修改并保存它们。

如果在整个会话期间保持ObjectContext活动,则每个用户将使用更少的内存,但是您将减少应用程序到数据库的传输,并且您将能够累积更改。并立即保存更改。由于EF实现了Identity Pattern,因此您不会加载同一对象的多个副本。

否则,如果您处置ObjectContext,将减少内存但会增加一次又一次加载对象的开销。您可能会一次又一次地在视图上加载同一对象的多个副本,并增加数据库服务器上的查询负载。