这是我的第一篇文章:)我是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()来明确地进行清理。
答案 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
会更有效。除此之外Find
和FirstOrDefault
几乎相同。
在任何情况下,上下文都不会加载整个表,也不会保持打开连接。我相信DbContext在DbContext被释放之前会保持连接,但是当需要解析查询时,它会根据需要打开和关闭连接。