《Entity Framework 6 Recipes》中文翻译——第九章EntityFramework在N层架构程序中的应用(六)

问题

  你希望WCF的客户端的实体变化标记只有在没有并发操作的时候才更新到数据库

解决方案

  假设你有一张如下的表

  我们要更新使用WCF服务,同时保证我们更新的秩序还没有从上次我们检索的顺序改变命令。我们将展示两个稍微不同的方法来处理这个问题。在这两种方法中,我们使用一个并发列,在我们的例子中,时间戳列。

  1、新建WCF服务库程序,命名Recipe6

  2、右键单击recipe5项目,并选择“添加新项。选择数据➤ADO.NET实体数据模型。使用向导添加一个模型包含Order表。右键单击Order实体中的时间戳属性,选择属性,并设置它的并发模式来固定。

  3、更改IService.cs文件的定义如下

[ServiceContract]
    public interface IService1
    {
        [OperationContract]
        Order InsertOrder();

        [OperationContract]
        void UpdateOrderWithoutRetrieving(Order order);

        [OperationContract]
        void UpdateOrderByRetrieving(Order order);
    }

  4、修改Servics.cs文件如下所示:

public class Service1 : IService1
    {
        public Order InsertOrder()
        {
            using (var context = new School5Entities())
            {
                context.Database.ExecuteSqlCommand("delete from Order");
                var order = new Order
                {
                    Product = "Camping Tent",
                    Quantity = 3,
                    Status = "Received"
                };
                context.Orders.Add(order);
                context.SaveChanges();
                return order;

            }
        }

        public void UpdateOrderByRetrieving(Order order)
        {
            using (var context = new School5Entities())
            {
                // fetch current entity from database
                var dbOrder = context.Orders
                               .Single(o => o.OrderId == order.OrderId);
                if (dbOrder != null &&
                    // execute concurrency check
                    StructuralComparisons.StructuralEqualityComparer.Equals(order.TimeStamp, dbOrder.TimeStamp))
                {
                    dbOrder.Quantity = order.Quantity;
                    context.SaveChanges();
                }
                else
                {
                    // Add code to handle concurrency issue 
                }
            }




        }

        public void UpdateOrderWithoutRetrieving(Order order)
        {
            using (var context = new School5Entities())
            {
                try
                {
                    context.Orders.Attach(order);
                    if (order.Status == "Received")
                    {
                        context.Entry(order).Property(x => x.Quantity).IsModified = true;
                        context.SaveChanges();
                    }
                }
                catch (OptimisticConcurrencyException ex)
                {
                    // Handle Optimistic Concurrency Exception

                }
            }
        }
    }

  5、为了测试我们的服务,在解决方案中添加一个新的控制台应用程序项目作为我们的客户端。通过右键单击客户端项目为客户端添加服务引用,并选择“添加服务引用”。你可能需要用鼠标右键单击服务项目并选择“调试➤启动实例,您可以添加在客户服务参考启动您的服务的实例。

 static void Main(string[] args)
        {
            var service = new Service1Client();
            var order = service.InsertOrder();
            order.Quantity = 5;
            service.UpdateOrderWithoutRetrieving(order);
            order = service.InsertOrder();
            order.Quantity = 3;
            service.UpdateOrderByRetrieving(order);
        }

 

posted on 2016-07-25 16:23  yunxia_云霞  阅读(172)  评论(0编辑  收藏  举报