zoukankan      html  css  js  c++  java
  • 如何管理Entity Framework中得事务

    http://msdn.microsoft.com/en-us/library/bb738523.aspx

     This topic provides an example of how to define a transaction that coordinates making changes to objects in an object context with other external operations. For more information, see Managing Connections and Transactions.

    The example in this topic is based on the AdventureWorks Sales Model. To run the code in this example, you must have already added the AdventureWorks Sales Model to your project and configured your project to use the Entity Framework. To do this, complete the procedure in How to: Use the Entity Data Model Wizard. You must also have Microsoft Windows Message Queuing installed.

    Example

    This example defines a TransactionScope. The TransactionScope ensures that changes to objects in the object context are coordinated with a message queue. The Entity Framework uses this transaction when it saves changes to the database. When an UpdateException occurs, the operation is retried up to two times. When the operation succeeds, the changes in the object context are accepted. For more information, see Managing Connections and Transactions.

    This example uses a long-running object context, which is disposed after the transaction succeeds or after all retries have been attempted.

    using System; using System.Linq; using System.Data; using System.Data.Objects; using System.Messaging; using System.Transactions;  namespace ObjectServicesConceptsCS {     class TransactionSample     {         public static void EnlistTransaction()         {             int retries = 3;             string queueName = @".\Fulfilling";              // Define variables that we need to add an item.             short quantity = 2;             int productId = 750;             int orderId = 43680;              // Define a long-running object context.             AdventureWorksEntities context                 = new AdventureWorksEntities();              bool success = false;              // Wrap the operation in a retry loop.             for (int i = 0; i < retries; i++)             {                 // Define a transaction scope for the operations.                 using (TransactionScope transaction = new TransactionScope())                 {                     try                     {                         // Define a query that returns a order by order ID.                         SalesOrderHeader order =                         context.SalesOrderHeaders.Where                         ("it.SalesOrderID = @id", new ObjectParameter(                          "id", orderId)).First();                          // Load items for the order, if not already loaded.                         if (!order.SalesOrderDetails.IsLoaded)                         {                             order.SalesOrderDetails.Load();                         }                          // Load the customer, if not already loaded.                         if (!order.ContactReference.IsLoaded)                         {                             order.ContactReference.Load();                         }                          // Create a new item for an existing order.                         SalesOrderDetail newItem = SalesOrderDetail.CreateSalesOrderDetail(                             0, 0, quantity, productId, 1, 0, 0, 0, Guid.NewGuid(), DateTime.Today);                          // Add new item to the order.                         order.SalesOrderDetails.Add(newItem);                          // Save changes pessimistically. This means that changes                          // must be accepted manually once the transaction succeeds.                         context.SaveChanges(SaveOptions.DetectChangesBeforeSave);                          // Create the message queue if it does not already exist.                         if (!MessageQueue.Exists(queueName))                         {                             MessageQueue.Create(queueName);                         }                          // Initiate fulfilling order by sending a message.                         using (MessageQueue q = new MessageQueue(queueName))                         {                             System.Messaging.Message msg =                                 new System.Messaging.Message(String.Format(                                     "<order customerId='{0}'>" +                                     "<orderLine product='{1}' quantity='{2}' />" +                                     "</order>", order.Contact.ContactID,                                 newItem.ProductID, newItem.OrderQty));                              // Send the message to the queue.                             q.Send(msg);                         }                          // Mark the transaction as complete.                         transaction.Complete();                         success = true;                         break;                     }                     catch (Exception ex)                     {                         // Handle errors and deadlocks here and retry if needed.                         // Allow an UpdateException to pass through and                          // retry, otherwise stop the execution.                         if (ex.GetType() != typeof(UpdateException))                         {                             Console.WriteLine("An error occured. "                                 + "The operation cannot be retried."                                 + ex.Message);                             break;                         }                         // If we get to this point, the operation will be retried.                     }                 }             }             if (success)             {                 // Reset the context since the operation succeeded.                 context.AcceptAllChanges();             }             else             {                 Console.WriteLine("The operation could not be completed in "                     + retries + " tries.");             }              // Dispose the object context.             context.Dispose();         }     } }  
  • 相关阅读:
    asp.net中3个常用的功能,直接上代码
    看WEB 2.0实战书中的部分技术资料 引用 很随笔,很杂乱
    Building a Web 2.0 Portal with ASP.NET 3.5(DropThings实例教学)
    如何防治猪流感!猪流感!?会像SARS那样爆发吗?我们能作的就是预防。
    招聘!北京 DNN程序员 5K7K
    国外的机器人爱好者使用C#等研发的一种家庭灭火机器人
    OLAP与OLTP的区别 及 什么是数据仓库
    动态绑定数据源的ReportViewer终于搞定了
    牛奶再次出事?!算了,我还是自己榨豆浆吧。中国人喝豆浆!
    c#遍历HashTable
  • 原文地址:https://www.cnblogs.com/hyl8218/p/2206929.html
Copyright © 2011-2022 走看看