2014-01-27 148 views
1

如果我的问题是正常的,我很抱歉。但我见面的时候我使用实体框架5.实体框架5:使用延迟加载或热切加载

如果让我选择预先加载设计我的ASP.NET MVC 4.0应用这个问题,我只是简化使用:

public Problem getProblemById(int id) { 
using(DBEntity ctx = new DBEntity()) 
      { 
       return (Problem) ctx.Posts.Find(id); 
      } 
} 

但是,如果使用预先加载,我会遇到问题:当我想浏览其所有属性,如评论(问题),用户(问题)......我必须手动使用Include来包含这些属性。有时候,如果我不使用这些属性,我会失去表现,也许我失去了实体框架的力量。

如果我使用Lazy Loading。有两种方法可以使用DBContext对象。第一种方式是在本地使用的DbContext对象:

public Problem getProblemById(int id) { 
DBEntity ctx = new DBEntity(); 
return (Problem) ctx.Posts.Find(id); 
} 

利用这一点,我想会遇到内存泄漏,因为CTX将永远不会再处理。

第二种方法是使的DbContext对象的静态和全球使用它:

static DBEntity ctx = new DBEntity(); 
public Problem getProblemById(int id) { 
return (Problem) ctx.Posts.Find(id); 
} 

我看了一些博客,他们说,如果我用这种方式,我必须控制并发访问(因为多请求发送到服务器)由我自己,OMG。例如此链接:

Entity Framework DBContext Usage

那么,怎样才能设计出我的应用程序,请帮我找出。

谢谢:)

回答

6

不要使用静态DBContext对象。请参阅c# working with Entity Framework in a multi threaded server

ASP.Net MVC的简单规则:使用每个用户请求的DBContext实例。

至于使用延迟加载与否,我会说这取决于,但我个人会关闭延迟加载。国际海事组织这是一个的功能,因为它存在的根本问题:

  • 实在太难处理异常,因为SQL请求可以在你的代码在任何地方失败(不只是在DAL因为如果不能很好地使用
  • 太容易写断码产生SQL十万一个开发者可以访问导航属性在任何一块代码)
  • 表现不佳请求
+0

因此,如果我使用延迟加载。我如何设计我的应用程序以使用DBContext对象?谢谢:) – hqt

+0

我看到很多帖子(包括MSDN链接),建议不要使用延迟加载。所以,为什么微软仍然有这样的选择程序员:(他们不作任何改变,使其更容易使用:(): – hqt

+0

@hqt使用延迟加载或不会改变你使用DBContext本身的方式;你会仍然需要找到一种方法来为每个用户请求创建一个新的实例,一个简单的方法是在每个控制器的构造函数中实例化DBContext,并将其传递给业务层,一种更健壮的方法是使用IoC框架自动请参阅http://www.codeproject.com/Articles/70061/Architecture-Guide-ASP-NET-MVC-Framework-plus-N-ti例如 – ken2k

相关问题