实体框架,DbSet <t>,Dispose()性能问题</t>

时间:2013-12-12 01:26:48

标签: entity-framework linq dispose

这是我的第一篇文章:)我是MVC .NET的新手。并且有关于实体框架功能和性能的一些问题。问题内联......

class StudentContext : DbContext
{
    public StudentContext() : base("myconnectionstring") {};
    public DbSet<Student> Students {get; set; }
    ...
}

问题:DbSet是否从数据库学生表中读取所有记录,并将其存储在集合学生(即内存)中?或者它只是保持与此表的连接,并且(记录)提取是在对数据库执行SQL时完成的?

对于以下内容:

private StudentContext db = new StudentContext();
Student astudent = db.Students.Find(id);

var astudent = from s in db.Students
               where s.StudentID == id)
               select s;

问题:哪些更好的表现?我不确定Find方法如何在集合下工作?

问题:数据库连接什么时候关闭?在Dispose()方法调用期间? 如果是这样,我应该为具有数据库上下文实例的类调用Dispose()方法吗?我在这里读到使用Using blocks。

我猜测Controller类的实例化,包括数据库访问,调用它关联的View,然后(Controller)超出范围并从内存中卸载。或者是garbase收藏家。但最好调用Dispose()来明确地进行清理。

1 个答案:

答案 0 :(得分:2)

Find方法在DbContext中查找具有指定键的实体。如果没有已加载的匹配实体,则DbContext将进行SELECT TOP 1查询以获取实体。

运行db.Students.Where(s => s.StudentID == id)将获得一个序列,其中包含从类似SELECT * FROM Students WHERE StudentID = @id的SQL查询返回的所有实体。那应该很快;您可以使用db.Students.FirstOrDefault(s => s.StudentID == id)来加快速度,这会为SQL查询添加TOP 1

如果您从同一个DbContext中多次加载同一个实体,则使用Find会更有效。除此之外FindFirstOrDefault几乎相同。

在任何情况下,上下文都不会加载整个表,也不会保持打开连接。我相信DbContext在DbContext被释放之前会保持连接,但是当需要解析查询时,它会根据需要打开和关闭连接。

相关问题