我在 MVC3 应用程序中看到了许多使用实体框架的示例,它们是非常简单的演示,其中只有一个带有 edmx 的 mvc3 Web 项目。
因此,他们可以通过“使用”语句使用打开和关闭连接的最佳实践:
using(var context = new SchoolEntities())
{
// do some query and return View with result.
}
而且,它可以在“使用”语句中正确使用延迟加载(导航属性),因为上下文尚未释放:
foreach(var item in student.Course)
{
// do something with the navigation property Course
}
在成为 n 层应用程序之前,一切似乎都很完美。
我创建了 DAL、BLL 和 MVC3 UI。
DAL里面有 edmx,还有像 SchoolDA.cs 这样的操作符类:
public class StudentDA()
{
public Student FindStudent(int studentId)
{
using(var context = new SchoolContext())
{
// do query, return a student object.
}
}
}
然后,在 BLL 中,如果我使用:
var student = studentDa.FindStudent(103);
然后调用它的导航属性:
student.Course
我会得到一个错误(当然):
ObjectContext 实例已被释放,不能再用于需要连接的操作。
所以,我必须像这样更改 StudentDA.cs:
public class StudentDA() : IDisposable
{
private SchoolEntites context;
public StudentDA()
{
context = new SchoolEntities();
}
public void Dispose()
{
context.Dispose();
}
public Student FindStudent(int studentId)
{
// do query, return a student object.
}
}
然后,BLL 会变成这样:
public Student FindStudent(int id)
{
using(var studentDa = new StudentDA())
{
// this can access navigation properties without error, and close the connection correctly.
return studentDa.FindStudent(id);
}
}
在遇到 Update() 方法之前,一切似乎都再次完美。
现在,如果我想更新从 BLL.FindStudent() 获取的学生对象,context.SaveChanges() 将返回 0,因为上下文已经在 BLL.FindStudent() 中处理,并且不会更新任何内容数据库。
var optStudent = new StudentBO();
var student = optStudent.FindStudent(103);
student.Name = "NewValue";
optStudent.Update(student);
有人知道如何在 3 轮胎应用程序中使用 EntityFramework 吗?或者我怎样才能正确管理上下文。我会经常在 web 层使用导航属性,但我不能总是保持连接打开来消耗服务器内存。