다음을 통해 공유


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.)에 의해 열거됩니다.
  • LINQ 연산자 First 또는 Any와 같은 것은 쿼리의 가장 바깥쪽 부분에 지정됩니다.
  • 지정된 키를 가진 엔터티가 컨텍스트에서 이미 로드되어 있지 않은 경우, 다음의 메서드 중 하나가 호출됩니다: Load 확장 메서드, DbEntityEntry.Reload, Database.ExecuteSqlCommand, 및 DbSet<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 이 프로세스를 수동으로 관리할 수 있습니다.