本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

ObjectContext.SaveChanges 方法 ()

 

將所有更新保存至資料來源並且重設物件內容中的變更追蹤。

命名空間:   System.Data.Objects
組件:  System.Data.Entity (於 System.Data.Entity.dll)

public int SaveChanges()

傳回值

Type: System.Int32

呼叫 Added 時處於 ModifiedDeletedSaveChanges 狀態中的物件數目。

Exception Condition
OptimisticConcurrencyException

在資料來源中已經發生開放式並行存取 (Optimistic Concurrency) 違規。

若要確保用戶端的物件已經由資料來源端邏輯所更新,您可以在呼叫 Refresh 之後,使用 StoreWins 值來呼叫 SaveChanges 方法。 如需詳細資訊,請參閱 儲存變更及管理並行存取

SaveChanges 在交易內運作。 SaveChanges 將復原該交易並擲回例外狀況,如果任何已變更 ObjectStateEntry 無法保存物件。

如果已經發生開放式並行存取違規,就會擲回 OptimisticConcurrencyException 您可以透過攔截開放式並行存取違規、使用 RefreshStoreWins 值來呼叫 ClientWins 方法,然後再次呼叫 SaveChanges,解決開放式並行存取違規。 如需詳細資訊,請參閱 How to︰ 管理物件內容中的資料並行

這個範例根據 AdventureWorks Sales Model 這個範例會嘗試儲存可能導致並行衝突的變更。 然後,它會示範如何透過重新整理物件內容,然後重新儲存變更,解決並行衝突。

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

.NET Framework
自 3.5 起供應
回到頁首
顯示: