방법: 개체 컨텍스트의 데이터 동시성 관리(Entity Framework)

이 항목에서는 개체 컨텍스트의 동시성을 관리하는 방법에 대한 예제를 제공합니다. 이 항목에서는 SalesOrderHeader 개체의 Status 속성을 업데이트할 때 OptimisticConcurrencyException을 생성하고 처리합니다. 자세한 내용은 변경 내용 저장 및 동시성 관리(Entity Framework)를 참조하십시오.

이 항목의 예제는 Adventure Works Sales 모델을 기반으로 합니다. 이 예제의 코드를 실행하려면 프로젝트에 AdventureWorks Sales 모델을 추가하고 Entity Framework를 사용하도록 프로젝트를 구성해야 합니다. 이렇게 하려면 방법: Entity Framework 프로젝트 수동 구성방법: 수동으로 모델 및 매핑 파일 정의(Entity Framework)의 절차를 수행합니다.

OptimisticConcurrencyException을 생성하려면 개념적 매핑 파일에서 Status 속성을 수정해야 합니다.

Status 속성에 대한 동시성 검사를 활성화하려면

  1. AdventureWorks.csdl 파일을 열고 SalesOrderHeader 엔터티에 대한 정의를 찾습니다.

  2. 자식 Status 요소를 찾아서 다음 특성을 추가합니다.

    ConcurrencyMode="fixed"
    
  3. AdventureWorks.csdl의 변경 내용을 저장합니다.

  4. 다음 예제 코드에서는 foreach 루프(Visual Basic에서는 For Each) 뒤에 중단점을 설정하고 디버그 모드에서 응용 프로그램을 실행합니다.

  5. 실행이 중단되면 SQL Server Management Studio에서 다음 Transact-SQL 명령을 AdventureWorks 데이터베이스에 대해 실행합니다.

    UPDATE Sales.SalesOrderHeader SET Status = 1 WHERE CreditCardApprovalCode IS NULL.
    
  6. 프로그램 실행을 다시 시작합니다.

예제

이 예제에서는 SalesOrderHeader 개체의 Status 속성 변경으로 인해 위 절차를 수행할 때 OptimisticConcurrencyException이 발생합니다.

Using context As New AdventureWorksEntities()
    Try
        ' Perform an operation with a high-level of concurrency. 
        ' Change the status of all orders without an approval code. 
        Dim orders As ObjectQuery(Of SalesOrderHeader) = context.SalesOrderHeaders.Where("it.CreditCardApprovalCode IS NULL").Top("100")

        For Each order As SalesOrderHeader In orders
            ' Reset the order status to 4 = Rejected. 
            order.Status = 4
        Next
        Try
            ' Try to save changes, which may cause a conflict. 
            Dim num As Integer = context.SaveChanges()
            Console.WriteLine("No conflicts. " & num.ToString() & " updates saved.")
        Catch generatedExceptionName As OptimisticConcurrencyException
            ' Resolve the concurrency conflict by refreshing the 
            ' object context before re-saving changes. 
            context.Refresh(RefreshMode.ClientWins, orders)

            ' Save changes. 
            context.SaveChanges()
            Console.WriteLine("OptimisticConcurrencyException handled and changes saved")
        End Try

        For Each order As SalesOrderHeader In orders
            Console.WriteLine(("Order ID: " & order.SalesOrderID.ToString() & " Order status: ") + order.Status.ToString())
        Next
    Catch ex As UpdateException
        Console.WriteLine(ex.ToString())
    End Try
End Using
using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    try
    {
        // Perform an operation with a high-level of concurrency.
        // Change the status of all orders without an approval code.
        ObjectQuery<SalesOrderHeader> orders =
            context.SalesOrderHeaders.Where(
            "it.CreditCardApprovalCode IS NULL").Top("100");

        foreach (SalesOrderHeader order in orders)
        {
            // Reset the order status to 4 = Rejected.
            order.Status = 4;
        }
        try
        {
            // Try to save changes, which may cause a conflict.
            int num = context.SaveChanges();
            Console.WriteLine("No conflicts. " +
                num.ToString() + " updates saved.");
        }
        catch (OptimisticConcurrencyException)
        {
            // Resolve the concurrency conflict by refreshing the 
            // object context before re-saving changes. 
            context.Refresh(RefreshMode.ClientWins, orders);

            // Save changes.
            context.SaveChanges();
            Console.WriteLine("OptimisticConcurrencyException "
            + "handled and changes saved");
        }

        foreach (SalesOrderHeader order in orders)
        {
            Console.WriteLine("Order ID: " + order.SalesOrderID.ToString()
                + " Order status: " + order.Status.ToString());
        }
    }
    catch (UpdateException ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

참고 항목

개념

개체 사용(Entity Framework)