ObjectContext.SaveChanges 메서드

정의

데이터 소스에 대한 모든 업데이트를 유지합니다.Persists all updates to the data source.

오버로드

SaveChanges()

데이터 소스에 대한 모든 업데이트를 유지하고 개체 컨텍스트에서 변경 내용 추적을 다시 설정합니다.Persists all updates to the data source and resets change tracking in the object context.

SaveChanges(Boolean)
사용되지 않습니다.

데이터 소스에 대한 모든 업데이트를 유지하고 선택적으로 개체 컨텍스트에서 변경 내용 추적을 다시 설정합니다.Persists all updates to the data source and optionally resets change tracking in the object context.

SaveChanges(SaveOptions)

지정된 SaveOptions를 사용하여 데이터 소스에 대한 모든 업데이트를 유지합니다.Persists all updates to the data source with the specified SaveOptions.

SaveChanges()

데이터 소스에 대한 모든 업데이트를 유지하고 개체 컨텍스트에서 변경 내용 추적을 다시 설정합니다.Persists all updates to the data source and resets change tracking in the object context.

public:
 int SaveChanges();
public int SaveChanges ();
member this.SaveChanges : unit -> int
Public Function SaveChanges () As Integer

반환

Int32

Added가 호출된 경우 Modified, Deleted 또는 SaveChanges() 상태의 개체 수입니다.The number of objects in an Added, Modified, or Deleted state when SaveChanges() was called.

예외

데이터 원본에서 낙관적 동시성 위반이 발생한 경우An optimistic concurrency violation has occurred in the data source.

예제

이 예제는 Microsoft SQL Server 제품 샘플: 데이터베이스를 기반으로 합니다.This example is based on the Microsoft SQL Server Product Samples: Database. 이 예에서는 동시성 충돌이 발생할 수 있는 변경 내용을 저장 하려고 시도 합니다.This example tries to save changes, which may cause a concurrency conflict. 그런 다음 변경 내용을 다시 저장 하기 전에 개체 컨텍스트를 새로 고쳐 동시성 충돌을 해결 하는 방법을 보여 줍니다.Then, it demonstrates how to resolve the concurrency conflict by refreshing the object context before re-saving changes.

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());
    }
}
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

설명

클라이언트의 개체가 데이터 원본 측 논리에 의해 업데이트 되었는지 확인 하기 위해를 호출한 후에는 값을 사용 하 여 메서드를 호출할 수 있습니다 Refresh StoreWins SaveChanges .To ensure that objects on the client have been updated by data source-side logic, you can call the Refresh method with the StoreWins value after you call SaveChanges. 자세한 내용은 변경 내용 저장 및 동시성 관리합니다.For more information, see Saving Changes and Managing Concurrency.

SaveChanges 트랜잭션 내에서 작동 합니다.SaveChanges operates within a transaction. SaveChanges 는 해당 트랜잭션을 롤백하고 더티 개체를 유지할 수 없는 경우 예외를 throw ObjectStateEntry 합니다.SaveChanges will roll back that transaction and throw an exception if any of the dirty ObjectStateEntry objects cannot be persisted.

낙관적 동시성 위반이 발생 한 경우 OptimisticConcurrencyException 이 throw 됩니다.If an optimistic concurrency violation has occurred, an OptimisticConcurrencyException is thrown. 낙관적 동시성 위반을 catch 하 고 Refresh 또는 값을 사용 하 여 메서드를 호출한 StoreWins ClientWins 다음를 다시 호출 하 여 낙관적 동시성 위반을 해결할 수 있습니다 SaveChanges .You can resolve an optimistic concurrency violation by catching it, calling the Refresh method with the StoreWins or ClientWins value, and then calling SaveChanges again. 자세한 내용은 방법: 개체 컨텍스트에서 데이터 동시성 관리를 참조 하세요.For more information, see How to: Manage Data Concurrency in the Object Context.

추가 정보

적용 대상

SaveChanges(Boolean)

주의

Use SaveChanges(SaveOptions options) instead.

데이터 소스에 대한 모든 업데이트를 유지하고 선택적으로 개체 컨텍스트에서 변경 내용 추적을 다시 설정합니다.Persists all updates to the data source and optionally resets change tracking in the object context.

public:
 int SaveChanges(bool acceptChangesDuringSave);
public int SaveChanges (bool acceptChangesDuringSave);
[System.ComponentModel.Browsable(false)]
[System.Obsolete("Use SaveChanges(SaveOptions options) instead.")]
public int SaveChanges (bool acceptChangesDuringSave);
member this.SaveChanges : bool -> int
[<System.ComponentModel.Browsable(false)>]
[<System.Obsolete("Use SaveChanges(SaveOptions options) instead.")>]
member this.SaveChanges : bool -> int
Public Function SaveChanges (acceptChangesDuringSave As Boolean) As Integer

매개 변수

acceptChangesDuringSave
Boolean

이 매개 변수는 클라이언트 쪽 트랜잭션을 지원하는 데 필요합니다.This parameter is needed for client-side transaction support. true이면 SaveChanges(Boolean)가 완료된 후 모든 개체에 대한 변경 내용 추적이 다시 설정되고,If true, the change tracking on all objects is reset after SaveChanges(Boolean) finishes. false이면 AcceptAllChanges()를 호출한 후 SaveChanges(Boolean) 메서드를 호출해야 합니다.If false, you must call the AcceptAllChanges() method after SaveChanges(Boolean).

반환

Int32

Added가 호출된 경우 Modified, Deleted 또는 SaveChanges() 상태의 개체 수입니다.The number of objects in an Added, Modified, or Deleted state when SaveChanges() was called.

특성

예외

낙관적 동시성 위반이 발생한 경우An optimistic concurrency violation has occurred.

설명

SaveChanges(SaveOptions)대신 메서드를 호출 합니다.Call the SaveChanges(SaveOptions) method instead.

적용 대상

SaveChanges(SaveOptions)

지정된 SaveOptions를 사용하여 데이터 소스에 대한 모든 업데이트를 유지합니다.Persists all updates to the data source with the specified SaveOptions.

public:
 virtual int SaveChanges(System::Data::Objects::SaveOptions options);
public virtual int SaveChanges (System.Data.Objects.SaveOptions options);
abstract member SaveChanges : System.Data.Objects.SaveOptions -> int
override this.SaveChanges : System.Data.Objects.SaveOptions -> int
Public Overridable Function SaveChanges (options As SaveOptions) As Integer

매개 변수

options
SaveOptions

작업의 동작을 결정하는 SaveOptions 값입니다.A SaveOptions value that determines the behavior of the operation.

반환

Int32

Added가 호출된 경우 Modified, Deleted 또는 SaveChanges() 상태의 개체 수입니다.The number of objects in an Added, Modified, or Deleted state when SaveChanges() was called.

예외

낙관적 동시성 위반이 발생한 경우An optimistic concurrency violation has occurred.

설명

의 특정 오버 로드 SaveChanges 를 사용 하 여 DetectChanges 데이터 소스에 대 한 변경 내용을 저장 하기 전이나 AcceptAllChanges 데이터 소스에 대 한 변경 내용을 저장 한 후에 호출 되는를 호출 하는지 확인 합니다.Use this specific overload of SaveChanges to either make sure that DetectChanges is called before you save changes to the data source or that AcceptAllChanges is called after you save changes to the data source.

이 열거형에는 FlagsAttribute 멤버 값의 비트 조합을 허용 하는가 있습니다.This enumeration has a FlagsAttribute that allows for a bitwise combination of its member values.

클라이언트의 개체가 데이터 원본 측 논리로 업데이트 되었는지 확인 하기 위해를 Refresh 호출한 후 값을 사용 하 여 메서드를 호출할 수 있습니다 StoreWins SaveChanges .To make sure that objects on the client have been updated by data source-side logic, you can call the Refresh method with the StoreWins value after you call SaveChanges. SaveChanges메서드는 트랜잭션에서 작동 합니다.The SaveChanges method operates in a transaction. SaveChanges 는 해당 트랜잭션을 롤백하고 커밋되지 않은 개체 중 하나를 유지할 수 없는 경우 예외를 throw ObjectStateEntry 합니다.SaveChanges will roll back that transaction and throw an exception if any one of the dirty ObjectStateEntry objects cannot be persisted.

낙관적 동시성 위반이 발생 한 경우 OptimisticConcurrencyException 이 throw 됩니다.If an optimistic concurrency violation has occurred, an OptimisticConcurrencyException is thrown. 낙관적 동시성 위반을 catch 하 고 Refresh 또는 값을 사용 하 여 메서드를 호출한 StoreWins ClientWins 다음 SaveChanges 메서드를 다시 호출 하 여 낙관적 동시성 위반을 해결할 수 있습니다.You can resolve an optimistic concurrency violation by catching it, calling the Refresh method with the StoreWins or ClientWins values, and then calling the SaveChanges method again. 자세한 내용은 방법: 개체 컨텍스트에서 데이터 동시성 관리를 참조 하세요.For more information, see How to: Manage Data Concurrency in the Object Context.

적용 대상