实体框架5:使用延迟加载或预先加载

时间:2014-01-27 11:04:44

标签: entity-framework asp.net-mvc-4

如果我的问题是正常的,我很抱歉。但是当我使用Entity Framework 5设计ASP.NET MVC 4.0应用程序时,我遇到了这个问题。

如果我选择Eager Loading,我只是简化使用:

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

但如果我使用Eager Loading,我会遇到问题:当我想浏览其所有属性时,例如评论(问题),用户(问题)......我必须手动使用Include来包括那些属性。有时,如果我不使用这些属性,我将失去性能,也许我失去了实体框架的力量。

如果我使用延迟加载。有两种方法可以使用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

那么,如何设计我的应用程序,请帮我弄清楚。

谢谢:)

1 个答案:

答案 0 :(得分:8)

请勿使用静态DBContext对象。见c# working with Entity Framework in a multi threaded server

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

至于是否使用延迟加载,我会说取决于,但我个人会停用延迟加载。 IMO它是一个损坏的功能,因为它存在基本问题:

  • 难以处理异常,因为SQL请求可能会在代码中的任何位置失败(不仅仅是在DAL中,因为一个开发人员可以访问导航任何代码片段中的属性)
  • 如果使用不当,表现不佳
  • 太容易编写产生数千个SQL请求的损坏代码