2013-12-12 1 views
2

이것은 내 첫 번째 게시물입니다. 저는 MVC .NET을 처음 사용합니다. 그리고 Entity Framework 기능 및 성능과 관련하여 몇 가지 질문이 있습니다. 인라인 질문 ...Entity Framework, DbSet <T>, Dispose() 성능 질문

질문 : DbSet은 데이터베이스 Student 테이블의 모든 레코드를 읽고 학생 (즉, 메모리)에 저장합니까? 아니면 단순히이 테이블에 연결을 유지하고 (레코드) 가져 오기는 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 Block을 사용하기 위해 여기를 읽었습니다.

컨트롤러 클래스 get이 인스턴스화 된 것으로 추측하고 있습니다. 데이터베이스 액세스를 포함하여 작동하고, 연결된 뷰를 호출 한 다음 (컨트롤러) 범위를 벗어나 메모리에서 언로드됩니다. 아니면 가루 수집가. 하지만 Dispose()를 호출하여 명시 적으로 정리 작업을 수행하는 것이 가장 좋습니다.

+0

내가 틀렸다면 정정 하겠지만'DbSet '은 LINQ to SQL이 아닌 Entity Framework를 사용한다는 것을 의미합니까? 그렇습니다. – MarcinJuraszek

+0

예, EF를 사용합니다. 죄송합니다. 새로운 이용 약관입니다. 나는 EF와 LINQ 진술을 말해야했다. –

+0

그래, 그 질문에 맞게 편집했습니다. – MarcinJuraszek

답변

3

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)을 사용하여 속도를 높일 수 있습니다. TOP 1이 SQL 쿼리에 추가됩니다.

동일한 DbContext에서 동일한 엔티티를 두 번 이상로드하는 경우 Find을 사용하면 더 효율적입니다. FindFirstOrDefault 이외는 거의 같습니다.

어느 경우에도 컨텍스트가 전체 테이블을로드하지 않으며 열기 연결도 유지되지 않습니다. 나는 DbContext가 폐기 될 때까지 DbContext가 연결을 유지한다고 믿지만, 질의를 해결할 필요가있을 때 연결을 열고 닫는다.

+0

네, 고마워요. http://msdn.microsoft.com/en-us/library/bb896325%28v=vs.100%29.aspx에서 Entity Framework는 쿼리를 실행하거나 SaveChanges를 호출하는 등 필요한 경우에만 연결을 엽니 다. 그런 다음 작업이 완료되면 연결을 닫습니다. 다음 메소드 중 하나를 호출하면 연결이 열립니다. 1. ObjectContext에서 SaveChanges 또는 Refresh를 저장하십시오. 2. FirstOrDefault 또는 ObjectQuery의 First. 3. EntityCollection에로드하십시오. 4. EntityReference에로드하십시오. 5.Where, OrderBy 또는 Select와 같은 LINQ (Language-Integrated Query) 메서드 또는 ObjectQuery 쿼리 작성기 메서드 –

+1

해당 목록의 번호 5가 올바르지 않습니다. 쿼리 메서드가 호출 될 때가 아니라 IQueryable이 * 열거 된 경우에만 연결이 열립니다. –