我有一个类,其中包含为我的MVC应用程序定制的几种常用方法,我在几个地方使用。以下是一些例子:
private MyEntities db = new MyEntities();
public List<SelectListItem> GetLocationList()
{
var query =
db.v_LocationsAlphabetical.OrderByDescending(x => x.Category).ThenBy(x => x.LocationName).ToList()
.Select(x => new SelectListItem
{
Value = x.LocationID.ToString(),
Text = x.LocationName
});
return (query).ToList();
}
public IEnumerable<SelectListItem> GetStates()
{
var query = db.States.Select(x => new SelectListItem
{
Value = x.Abbr,
Text = x.Name
});
return(query);
}
public List<Person> GetPeople()
{
var query = db.Person.OrderBy(m => m.LastName).ThenBy(m => m.FirstName).ToList();
return (query);
}
这些方法中的每一个都调用数据库来获取数据,我想知道是否需要为每个方法添加一个dispose。如果没有,为什么?感谢。
答案 0 :(得分:6)
您不应该在每个方法中调用dispose,因为db
的生命周期与封闭类的生命周期相同,因为它不是方法中的局部变量。
处理此问题的典型方法是制作当前的班级IDisposable
并在db.Dispose()
方法中调用Dispose()
。
答案 1 :(得分:0)
没有。除非您自己手动管理连接,否则不必手动处理DbContexts。因此,处理它们通常是可选的。
答案 2 :(得分:0)
在.NET中有多种处理数据库连接的方法
我最喜欢的一个叫one dbcontext per request
,它基本上意味着你在需要时初始化dbcontext,不考虑实例化或处理就完成工作,并在请求完成后自动处理。 (有点UnitOfWork-ish)
我已经展示了这种方法here。它不仅适用于EF,也适用于Linq2SQL,ADO.NET等。