DbContext 작업

Entity Framework를 사용하여 .NET 개체를 통해 데이터를 쿼리, 삽입, 업데이트 및 삭제하려면 먼저 모델에 정의된 엔터티와 관계를 데이터베이스의 테이블에 매핑하는 모델을 만들어야 합니다.

모델이 있는 경우 애플리케이션이 상호 작용하는 기본 클래스는 System.Data.Entity.DbContext입니다(컨텍스트 클래스라고도 함). 모델에 연결된 DbContext를 사용하여 다음을 수행할 수 있습니다.

  • 쿼리 작성 및 실행
  • 쿼리 결과를 엔터티 개체로 구체화
  • 해당 개체에 대한 변경 내용 추적
  • 데이터베이스에 개체 변경 내용 다시 유지
  • 메모리의 개체를 UI 컨트롤에 바인딩

이 페이지에서는 컨텍스트 클래스를 관리하는 방법에 대한 몇 가지 지침을 제공합니다.

DbContext 파생 클래스 정의

컨텍스트를 사용하는 권장 방법은 DbContext에서 파생되고 컨텍스트에서 지정된 엔터티의 컬렉션을 나타내는 DbSet 속성을 노출하는 클래스를 정의하는 것입니다. EF 디자이너를 사용하는 경우 컨텍스트가 생성됩니다. Code First로 작업하는 경우 일반적으로 컨텍스트를 직접 작성합니다.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

컨텍스트가 있는 경우 이러한 속성을 통해 컨텍스트에서 엔터티를 쿼리, 추가(Add 또는 Attach 메서드 사용) 또는 제거(Remove 사용)합니다. 컨텍스트 개체의 DbSet 속성에 액세스하는 것은 지정된 형식의 모든 엔터티를 반환하는 시작 쿼리를 나타냅니다. 속성에 액세스하기만 하면 쿼리가 실행되지 않습니다. 개체 쿼리는 다음과 같은 경우에 실행됩니다.

  • foreach(C#) 또는 For Each(Visual Basic) 문에 의해 열거된 경우
  • ToArray, ToDictionary 또는 ToList 등의 컬렉션 작업에 의해 열거된 경우.
  • 쿼리의 가장 바깥쪽 부분에 First 또는 Any 등의 LINQ 연산자가 지정된 경우.
  • 지정된 키를 가진 엔터티가 컨텍스트에 아직 로드되지 않은 경우 Load 확장 메서드, DbEntityEntry.Reload, Database.ExecuteSqlCommandDbSet<T>.Find 메서드 중 하나가 호출됩니다.

수명

컨텍스트의 수명은 인스턴스가 만들어질 때 시작되고 인스턴스가 삭제되거나 가비지 수집될 때 끝납니다. 컨텍스트에서 제어하는 모든 리소스가 블록의 끝에서 삭제되도록 하려면 using을 사용합니다. using을 사용하는 경우 컴파일러에서 try/finally 블록을 만들고 블록에서 finally 블록에서 dispose를 호출합니다.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

컨텍스트의 수명 결정에 대한 일반 지침은 다음과 같습니다.

  • 웹 응용 프로그램으로 작업하는 경우 컨텍스트 인스턴스를 요청당 하나씩 사용합니다.
  • WPF(Windows Presentation Foundation) 또는 Windows Forms로 작업하는 경우 컨텍스트 인스턴스를 양식당 하나씩 사용합니다. 그러면 컨텍스트에서 제공하는 변경 내용 추적 기능을 사용할 수 있습니다.
  • 컨텍스트 인스턴스가 종속성 주입 컨테이너에 의해 만들어진 경우 일반적으로 컨텍스트를 삭제하는 것은 컨테이너의 책임입니다.
  • 애플리케이션 코드에서 컨텍스트를 만들면 더 이상 필요하지 않은 경우 컨텍스트를 삭제해야 합니다.
  • 오래 실행되는 개체 컨텍스트로 작업하는 경우 고려할 사항은 다음과 같습니다.
    • 더 많은 개체와 해당 참조를 메모리에 로드하면 컨텍스트의 메모리 사용량이 빠르게 증가할 수 있습니다. 이로 인해 성능 문제가 발생할 수 있습니다.
    • 컨텍스트는 스레드로부터 안전하지 않으므로 작업을 수행하는 여러 스레드에서 동시에 공유해서는 안 됩니다.
    • 예외로 인해 컨텍스트가 복구할 수 없는 상태가 되면 전체 응용 프로그램이 종료될 수 있습니다.
    • 데이터가 쿼리되는 시간과 업데이트되는 시간의 간격이 커짐에 따라 동시성 관련 문제가 발생할 가능성이 높아집니다.

연결

기본적으로 컨텍스트는 데이터베이스 연결을 관리합니다. 컨텍스트에서는 필요에 따라 연결을 열고 닫습니다. 예를 들어 컨텍스트에서는 연결을 열어 쿼리를 실행한 다음 결과 집합이 모두 처리되었을 때 연결을 닫습니다.

연결이 열리고 닫히는 때를 세부적으로 제어해야 하는 경우가 있습니다. 예를 들어 SQL Server Compact에서 작업할 때 성능을 향상시키려면 애플리케이션 수명 동안 데이터베이스에 대한 별도의 열린 연결을 유지하는 것이 좋습니다. Connection 속성을 사용하여 이 프로세스를 수동으로 관리할 수 있습니다.