Example #1
0
        private void ConflictOnDelete(Action <EnterpriseContext> save)
        {
            EnterpriseContext context = new EnterpriseContext();

            // Add order1
            Order order1 = new Order();

            context.Orders.Add(order1);

            // Add orderDetail1
            OrderDetail orderDetail1 = new OrderDetail();

            orderDetail1.Order = order1;
            context.OrderDetails.Add(orderDetail1);

            // Add customer1
            Customer customer1 = new Customer();

            customer1.FirstName = "customer1";
            context.Customers.Add(customer1);

            customer1.Orders.Add(order1);

            #region check

            order1.CheckAdded();
            customer1.CheckAdded();
            orderDetail1.CheckAdded();

            context.Changes.CheckCount(3)
            .CheckFound(order1)
            .CheckFound(customer1)
            .CheckFound(orderDetail1);

            #endregion check

            // save changes
            context.Execute(save);

            #region check

            context.Changes.CheckCount(0);

            order1.CheckUnchanged();
            customer1.CheckUnchanged();
            orderDetail1.CheckUnchanged();

            customer1.Orders.CheckCount(1).CheckItem(0, order1);

            order1.Customer.Check(customer1);
            order1.CustomerID.Check(customer1.ID);
            order1.OrderDetails.CheckCount(1).CheckItem(0, orderDetail1);

            orderDetail1.Order.Check(order1);
            orderDetail1.OrderID.Check(order1.ID);

            order1.GetChangedProperties().CheckCount(0);
            customer1.GetChangedProperties().CheckCount(0);
            orderDetail1.GetChangedProperties().CheckCount(0);

            #endregion check

            // Add shipment1
            Shipment shipment1 = new Shipment();
            context.Shipments.Add(shipment1);

            // Add order2
            Order order2 = new Order();
            context.Orders.Add(order2);

            // Modify orderDetail1
            orderDetail1.Order = order2;

            // Add orderDetail2
            OrderDetail orderDetail2 = new OrderDetail();
            orderDetail2.Order = order2;
            context.OrderDetails.Add(orderDetail2);

            // Modify order1
            order1.Customer = null;

            // Add customer2
            Customer customer2 = new Customer();
            customer2.FirstName = "customer2";
            context.Customers.Add(customer2);

            // Modify customer1
            customer1.SecondPartner = customer2;

            // Modify order1
            order1.Customer = customer2;

            shipment1.Order = order2;

            // Add customer3
            Customer customer3 = new Customer();
            customer3.FirstName = "customer3";
            context.Customers.Add(customer3);

            customer2.FirstPartner = customer3;

            // Delete customer1
            context.Customers.Remove(customer1);

            order2.Customer = customer2;

            // Modify order1
            order1.Customer = customer3;

            #region check

            order2.CheckAdded();
            shipment1.CheckAdded();
            customer2.CheckAdded();
            customer3.CheckAdded();
            orderDetail2.CheckAdded();

            customer1.CheckDeleted();

            order1.CheckModified();
            order1.Customer.Check(customer3);
            order1.CustomerID.Check(customer3.ID);
            order1.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

            orderDetail1.CheckModified();
            orderDetail1.Order.Check(order2);
            orderDetail1.OrderID.Check(order2.ID);
            orderDetail1.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.OrderID);

            context.Changes.CheckCount(8)
            .CheckFound(order1)
            .CheckFound(order2)
            .CheckFound(shipment1)
            .CheckFound(customer1)
            .CheckFound(customer2)
            .CheckFound(customer3)
            .CheckFound(orderDetail1)
            .CheckFound(orderDetail2);

            #endregion check

            #region delete order1

            async Task delete()
            {
                EntityDatabaseConnection connection = GetConnection();

                await connection.OpenAsync();

                connection.BeginTransaction(IsolationLevel.Snapshot);

                await Database.Connect(connection)
                .Prepared()
                .WithParameters(new { OrderID = order1.ID })
                .Query(@"set nocount on;

                                       delete Orders
                                       where ID = @OrderID;

                                       waitfor delay '00:00:00.5'

                                      ")
                .ExecuteAsync()
                .ContinueWith(t =>
                {
                    if (!t.IsFaulted)
                    {
                        throw new Exception("Expected Exception, Was Not Thrown");
                    }

                    connection.RollbackTransaction();
                    connection.Close();
                });
            }

            Task task = delete();

            #endregion delete order1

            // save changes
            context.Execute(save);

            task.Wait();

            #region check

            order1.CheckUnchanged();
            order2.CheckUnchanged();
            shipment1.CheckUnchanged();
            customer2.CheckUnchanged();
            customer3.CheckUnchanged();
            orderDetail1.CheckUnchanged();
            orderDetail2.CheckUnchanged();

            customer1.CheckDetached();

            order1.Customer.Check(customer3);
            order1.CustomerID.Check(customer3.ID);
            order1.GetChangedProperties().CheckCount(0);
            order1.OrderDetails.CheckCount(0);
            order1.Shipment.CheckItem(null);

            order2.Customer.Check(customer2);
            order2.CustomerID.Check(customer2.ID);
            order2.GetChangedProperties().CheckCount(0);
            order2.OrderDetails.CheckCount(2).CheckItem(0, orderDetail1).CheckItem(1, orderDetail2);
            order2.Shipment.CheckItem(shipment1);

            shipment1.Order.Check(order2);
            shipment1.OrderID.Check(order2.ID);
            shipment1.GetChangedProperties().CheckCount(0);

            customer2.FirstPartner.Check(customer3);
            customer2.FirstPartnerID.Check(customer3.ID);
            customer2.SecondPartner.Check(null);
            customer2.SecondPartnerID.Check(null);
            customer2.GetChangedProperties().CheckCount(0);
            customer2.Orders.CheckCount(1).CheckItem(0, order2);
            customer2.FirstPartners.CheckCount(0);
            customer2.SecondPartners.CheckCount(0);

            customer3.FirstPartner.Check(null);
            customer3.FirstPartnerID.Check(null);
            customer3.SecondPartner.Check(null);
            customer3.SecondPartnerID.Check(null);
            customer2.GetChangedProperties().CheckCount(0);
            customer3.Orders.CheckCount(1).CheckItem(0, order1);
            customer3.FirstPartners.CheckCount(1).CheckItem(0, customer2);
            customer3.SecondPartners.CheckCount(0);

            orderDetail1.Order.Check(order2);
            orderDetail1.OrderID.Check(order2.ID);
            orderDetail1.GetChangedProperties().CheckCount(0);

            orderDetail2.Order.Check(order2);
            orderDetail2.OrderID.Check(order2.ID);
            orderDetail2.GetChangedProperties().CheckCount(0);

            context.Changes.CheckCount(0);

            #endregion check
        }
Example #2
0
        private void ConflictOnUpdate(Action <EnterpriseContext> save)
        {
            EnterpriseContext context = new EnterpriseContext();

            // Add order1
            Order order1 = new Order();

            context.Orders.Add(order1);

            // Add orderDetail1
            OrderDetail orderDetail1 = new OrderDetail();

            orderDetail1.Order = order1;
            context.OrderDetails.Add(orderDetail1);

            // Add customer1
            Customer customer1 = new Customer();

            customer1.FirstName = "customer1";
            context.Customers.Add(customer1);

            customer1.Orders.Add(order1);

            #region check

            order1.CheckAdded();
            customer1.CheckAdded();
            orderDetail1.CheckAdded();

            context.Changes.CheckCount(3)
            .CheckFound(order1)
            .CheckFound(customer1)
            .CheckFound(orderDetail1);

            #endregion check

            // save changes
            context.Execute(save);

            #region check

            context.Changes.CheckCount(0);

            order1.CheckUnchanged();
            customer1.CheckUnchanged();
            orderDetail1.CheckUnchanged();

            customer1.Orders.CheckCount(1).CheckItem(0, order1);

            order1.Customer.Check(customer1);
            order1.CustomerID.Check(customer1.ID);
            order1.OrderDetails.CheckCount(1).CheckItem(0, orderDetail1);

            orderDetail1.Order.Check(order1);
            orderDetail1.OrderID.Check(order1.ID);

            order1.GetChangedProperties().CheckCount(0);
            customer1.GetChangedProperties().CheckCount(0);
            orderDetail1.GetChangedProperties().CheckCount(0);

            #endregion check

            // Add shipment1
            Shipment shipment1 = new Shipment();
            context.Shipments.Add(shipment1);

            // Add order2
            Order order2 = new Order();
            context.Orders.Add(order2);

            // Modify orderDetail1
            orderDetail1.Order = order2;

            // Add orderDetail2
            OrderDetail orderDetail2 = new OrderDetail();
            orderDetail2.Order = order2;
            context.OrderDetails.Add(orderDetail2);

            // Modify order1
            order1.Customer = null;

            // Add customer2
            Customer customer2 = new Customer();
            customer2.FirstName = "customer2";
            context.Customers.Add(customer2);

            // Modify customer1
            customer1.SecondPartner = customer2;

            // Modify order1
            order1.Customer = customer2;

            shipment1.Order = order2;

            // Add customer3
            Customer customer3 = new Customer();
            customer3.FirstName = "customer3";
            context.Customers.Add(customer3);

            customer2.FirstPartner = customer3;

            // Delete customer1
            context.Customers.Remove(customer1);

            order2.Customer = customer2;

            // Modify order1
            order1.Customer = customer3;

            #region check

            order2.CheckAdded();
            shipment1.CheckAdded();
            customer2.CheckAdded();
            customer3.CheckAdded();
            orderDetail2.CheckAdded();

            customer1.CheckDeleted();

            order1.CheckModified();
            order1.Customer.Check(customer3);
            order1.CustomerID.Check(customer3.ID);
            order1.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

            orderDetail1.CheckModified();
            orderDetail1.Order.Check(order2);
            orderDetail1.OrderID.Check(order2.ID);
            orderDetail1.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.OrderID);

            context.Changes.CheckCount(8)
            .CheckFound(order1)
            .CheckFound(order2)
            .CheckFound(shipment1)
            .CheckFound(customer1)
            .CheckFound(customer2)
            .CheckFound(customer3)
            .CheckFound(orderDetail1)
            .CheckFound(orderDetail2);

            #endregion check

            #region update order1

            async Task update()
            {
                EntityDatabaseConnection connection = GetConnection();

                await connection.OpenAsync();

                connection.BeginTransaction(IsolationLevel.Snapshot);

                await Database.Connect(connection)
                .Prepared()
                .WithParameters(new { OrderID = order1.ID, ShippingDate = "1398/06/30".ToDateTime() })
                .Query(@"set nocount on;

                                       update Orders
                                          set ShippingDate = @ShippingDate
                                       where ID = @OrderID;

                                       waitfor delay '00:00:00.5'

                                      ")
                .ExecuteAsync();

                connection.CommitTransaction();
                connection.Close();
            }

            Task task = update();

            #endregion update order1

            try
            {
                // save changes
                context.Execute(save);
            }
            catch (SqlException e) when(e.Number == 3960)
            {
                // it's ok, conflict was occurred
            }

            task.Wait();

            #region check

            order2.CheckAdded();
            shipment1.CheckAdded();
            customer2.CheckAdded();
            customer3.CheckAdded();
            orderDetail2.CheckAdded();

            customer1.CheckDeleted();

            order1.CheckModified();
            order1.Customer.Check(customer3);
            order1.CustomerID.Check(customer3.ID);
            order1.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

            orderDetail1.CheckModified();
            orderDetail1.Order.Check(order2);
            orderDetail1.OrderID.Check(order2.ID);
            orderDetail1.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.OrderID);

            context.Changes.CheckCount(8)
            .CheckFound(order1)
            .CheckFound(order2)
            .CheckFound(shipment1)
            .CheckFound(customer1)
            .CheckFound(customer2)
            .CheckFound(customer3)
            .CheckFound(orderDetail1)
            .CheckFound(orderDetail2);

            #endregion check
        }
Example #3
0
        private void Overflow(Action <EnterpriseContext> save)
        {
            EnterpriseContext context = new EnterpriseContext();

            // Add order1
            Order order1 = new Order();

            context.Orders.Add(order1);

            // Add orderDetail1
            OrderDetail orderDetail1 = new OrderDetail();

            orderDetail1.Order = order1;
            context.OrderDetails.Add(orderDetail1);

            // Add customer1
            Customer customer1 = new Customer();

            customer1.FirstName = "customer1";
            context.Customers.Add(customer1);

            customer1.Orders.Add(order1);

            #region check

            order1.CheckAdded();
            customer1.CheckAdded();
            orderDetail1.CheckAdded();

            context.Changes.CheckCount(3)
            .CheckFound(order1)
            .CheckFound(customer1)
            .CheckFound(orderDetail1);

            #endregion check

            // save changes
            context.Execute(save);

            #region check

            context.Changes.CheckCount(0);

            order1.CheckUnchanged();
            customer1.CheckUnchanged();
            orderDetail1.CheckUnchanged();

            customer1.Orders.CheckCount(1).CheckItem(0, order1);

            order1.Customer.Check(customer1);
            order1.CustomerID.Check(customer1.ID);
            order1.OrderDetails.CheckCount(1).CheckItem(0, orderDetail1);

            orderDetail1.Order.Check(order1);
            orderDetail1.OrderID.Check(order1.ID);

            order1.GetChangedProperties().CheckCount(0);
            customer1.GetChangedProperties().CheckCount(0);
            orderDetail1.GetChangedProperties().CheckCount(0);

            #endregion check

            // Add shipment1
            Shipment shipment1 = new Shipment();
            context.Shipments.Add(shipment1);

            // Add order2
            Order order2 = new Order();
            context.Orders.Add(order2);

            // Modify orderDetail1
            orderDetail1.Order = order2;

            // Add orderDetail2
            OrderDetail orderDetail2 = new OrderDetail();
            orderDetail2.Order = order2;
            context.OrderDetails.Add(orderDetail2);

            // Modify order1
            order1.Customer = null;

            // Add customer2
            Customer customer2 = new Customer();
            customer2.FirstName = "customer2";
            context.Customers.Add(customer2);

            // Modify customer1
            customer1.SecondPartner = customer2;

            // Modify order1
            order1.Customer = customer2;

            shipment1.Order = order2;

            // Add customer3
            Customer customer3 = new Customer();
            customer3.FirstName = "customer3";
            context.Customers.Add(customer3);

            customer2.FirstPartner = customer3;

            // Delete customer1
            context.Customers.Remove(customer1);

            order2.Customer = customer2;

            // Modify order1
            order1.Customer = customer3;

            #region check

            order2.CheckAdded();
            shipment1.CheckAdded();
            customer2.CheckAdded();
            customer3.CheckAdded();
            orderDetail2.CheckAdded();

            customer1.CheckDeleted();

            order1.CheckModified();
            order1.Customer.Check(customer3);
            order1.CustomerID.Check(customer3.ID);
            order1.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

            orderDetail1.CheckModified();
            orderDetail1.Order.Check(order2);
            orderDetail1.OrderID.Check(order2.ID);
            orderDetail1.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.OrderID);

            context.Changes.CheckCount(8)
            .CheckFound(order1)
            .CheckFound(order2)
            .CheckFound(shipment1)
            .CheckFound(customer1)
            .CheckFound(customer2)
            .CheckFound(customer3)
            .CheckFound(orderDetail1)
            .CheckFound(orderDetail2);

            #endregion check

            Truncate_And_Insert();

            try
            {
                // save changes
                context.Execute(save);
            }
            catch (SqlException e) when(e.Number == 8115)  // arithmetic overflow error
            {
                Truncate_And_ReseedIdentity();
            }

            #region check

            order2.CheckAdded();
            shipment1.CheckAdded();
            customer2.CheckAdded();
            customer3.CheckAdded();
            orderDetail2.CheckAdded();

            customer1.CheckDeleted();

            order1.CheckModified();
            order1.Customer.Check(customer3);
            order1.CustomerID.Check(customer3.ID);
            order1.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

            orderDetail1.CheckModified();
            orderDetail1.Order.Check(order2);
            orderDetail1.OrderID.Check(order2.ID);
            orderDetail1.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.OrderID);

            context.Changes.CheckCount(8)
            .CheckFound(order1)
            .CheckFound(order2)
            .CheckFound(shipment1)
            .CheckFound(customer1)
            .CheckFound(customer2)
            .CheckFound(customer3)
            .CheckFound(orderDetail1)
            .CheckFound(orderDetail2);

            #endregion check
        }
Example #4
0
        private void Conflict(Action <EnterpriseContext> save)
        {
            EnterpriseContext context = new EnterpriseContext();

            #region step1: define some new data ...

            Order order = new Order();
            order.ReceiveDate = "1398/06/25".ToDateTime();
            context.Orders.Add(order);

            OrderDetail orderDetail = new OrderDetail();
            orderDetail.Order  = order;
            orderDetail.Amount = 100;
            context.OrderDetails.Add(orderDetail);

            Customer ali = new Customer();
            ali.FirstName = "Ali";
            ali.LastName  = "Zare";
            context.Customers.Add(ali);

            order.Customer = ali;

            Product laptop = new Product();
            laptop.Name = "Laptop Asus N552";
            context.Products.Add(laptop);

            orderDetail.Product = laptop;


            #region check

            laptop.CheckAdded();

            ali.CheckAdded();
            ali.Orders.CheckCount(1).CheckItem(0, order);

            order.CheckAdded();
            order.CustomerID.Check(ali.ID);
            order.OrderDetails.CheckCount(1).CheckItem(0, orderDetail);

            orderDetail.CheckAdded();
            orderDetail.OrderID.Check(order.ID);
            orderDetail.ProductID.Check(laptop.ID);

            context.Changes.CheckCount(4)
            .CheckFound(laptop)
            .CheckFound(ali)
            .CheckFound(order)
            .CheckFound(orderDetail);

            #endregion check

            // save changes
            context.Execute(save);

            #region check

            laptop.CheckUnchanged();

            ali.CheckUnchanged();
            ali.Orders.CheckCount(1).CheckItem(0, order);

            order.CheckUnchanged();
            order.Customer.Check(ali);
            order.CustomerID.Check(ali.ID);
            order.OrderDetails.CheckCount(1).CheckItem(0, orderDetail);

            orderDetail.CheckUnchanged();
            orderDetail.Order.Check(order);
            orderDetail.OrderID.Check(order.ID);
            orderDetail.Product.Check(laptop);
            orderDetail.ProductID.Check(laptop.ID);

            context.Changes.CheckCount(0);

            #endregion check

            #endregion step1: define some new data ...


            // Test Snapshot ...
            #region step2: define some new data and edit previous data ...

            Order order1 = new Order();
            order1.Customer    = ali;
            order1.ReceiveDate = "1398/07/07".ToDateTime();
            context.Orders.Add(order1);

            OrderDetail orderDetail1 = new OrderDetail();
            orderDetail1.Order  = order1;
            orderDetail1.Amount = 500;
            context.OrderDetails.Add(orderDetail1);

            Customer amir = new Customer();
            amir.FirstName = "Amir";
            amir.LastName  = "Zare";
            context.Customers.Add(amir);

            order.Customer = amir;

            Product tv = new Product();
            tv.Name = "Sony NX 40 inch";
            context.Products.Add(tv);

            orderDetail.Product  = tv;
            orderDetail1.Product = laptop;

            #region check

            laptop.CheckUnchanged();

            ali.CheckUnchanged();
            ali.Orders.CheckCount(1).CheckItem(0, order1);

            order.CheckModified();
            order.CustomerID.Check(amir.ID);
            order.OrderDetails.CheckCount(1).CheckItem(0, orderDetail);
            order.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

            orderDetail.CheckModified();
            orderDetail.ProductID.Check(tv.ID);
            orderDetail.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.ProductID);

            tv.CheckAdded();

            amir.CheckAdded();
            amir.Orders.CheckCount(1).CheckItem(0, order);

            order1.CheckAdded();
            order1.CustomerID.Check(ali.ID);
            order1.OrderDetails.CheckCount(1).CheckItem(0, orderDetail1);

            orderDetail1.CheckAdded();
            orderDetail1.OrderID.Check(order1.ID);
            orderDetail1.ProductID.Check(laptop.ID);

            context.Changes.CheckCount(6)
            .CheckFound(tv)
            .CheckFound(amir)
            .CheckFound(order)
            .CheckFound(order1)
            .CheckFound(orderDetail)
            .CheckFound(orderDetail1);

            #endregion check

            bool has_concurrency_conflict = false;

            #region parallel delete

            EntityDatabaseConnection connection = GetConnection();

            connection.Open();

            Database.Connect(connection)
            .Prepared()
            .WithParameters(new { OrderID = order.ID })
            .Query(@"set nocount on;

                             delete 
                             from OrderDetails
                             where OrderID = @OrderID

                             delete 
                             from Orders
                             where ID = @OrderID")
            .Execute();

            connection.Close();

            #endregion parallel delete

            try
            {
                // save changes
                context.Execute(save);
            }
            catch (EntityDatabaseConcurrencyException)
            {
                has_concurrency_conflict = true;
            }

            #region check

            if (has_concurrency_conflict)
            {
                laptop.CheckUnchanged();

                ali.CheckUnchanged();
                ali.Orders.CheckCount(1).CheckItem(0, order1);

                order.CheckModified();
                order.CustomerID.Check(amir.ID);
                order.OrderDetails.CheckCount(1).CheckItem(0, orderDetail);
                order.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

                orderDetail.CheckModified();
                orderDetail.ProductID.Check(tv.ID);
                orderDetail.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.ProductID);

                tv.CheckAdded();

                amir.CheckAdded();
                amir.Orders.CheckCount(1).CheckItem(0, order);

                order1.CheckAdded();
                order1.CustomerID.Check(ali.ID);
                order1.OrderDetails.CheckCount(1).CheckItem(0, orderDetail1);

                orderDetail1.CheckAdded();
                orderDetail1.OrderID.Check(order1.ID);
                orderDetail1.ProductID.Check(laptop.ID);

                context.Changes.CheckCount(6)
                .CheckFound(tv)
                .CheckFound(amir)
                .CheckFound(order)
                .CheckFound(order1)
                .CheckFound(orderDetail)
                .CheckFound(orderDetail1);
            }
            else
            {
                throw new Exception("Expected Exception, Was Not Thrown");

                #region not reachable code

                tv.CheckUnchanged();
                laptop.CheckUnchanged();

                ali.CheckUnchanged();
                ali.Orders.CheckCount(1).CheckItem(0, order1);

                amir.CheckUnchanged();
                amir.Orders.CheckCount(1).CheckItem(0, order);

                order.CheckUnchanged();
                order.Customer.Check(amir);
                order.CustomerID.Check(amir.ID);
                order.OrderDetails.CheckCount(1).CheckItem(0, orderDetail);

                order1.CheckUnchanged();
                order1.Customer.Check(ali);
                order1.CustomerID.Check(ali.ID);
                order1.OrderDetails.CheckCount(1).CheckItem(0, orderDetail1);

                orderDetail.CheckUnchanged();
                orderDetail.Order.Check(order);
                orderDetail.OrderID.Check(order.ID);
                orderDetail.Product.Check(tv);
                orderDetail.ProductID.Check(tv.ID);

                orderDetail1.CheckUnchanged();
                orderDetail1.Order.Check(order1);
                orderDetail1.OrderID.Check(order1.ID);
                orderDetail1.Product.Check(laptop);
                orderDetail1.ProductID.Check(laptop.ID);

                context.Changes.CheckCount(0);

                #endregion not reachable code
            }

            #endregion check

            #endregion step2: define some new data and edit previous data ...
        }
Example #5
0
        private void ConcurrencyOnDelete(Action <EnterpriseContext> save, bool hasConcurrency, bool hasConflict)
        {
            EnterpriseContext context = new EnterpriseContext();

            // Add order1
            Order order1 = new Order();

            context.Orders.Add(order1);

            // Add orderDetail1
            OrderDetail orderDetail1 = new OrderDetail();

            orderDetail1.Order = order1;
            context.OrderDetails.Add(orderDetail1);

            // Add customer1
            Customer customer1 = new Customer();

            customer1.FirstName = "customer1";
            context.Customers.Add(customer1);

            customer1.Orders.Add(order1);

            #region check

            order1.CheckAdded();
            customer1.CheckAdded();
            orderDetail1.CheckAdded();

            context.Changes.CheckCount(3)
            .CheckFound(order1)
            .CheckFound(customer1)
            .CheckFound(orderDetail1);

            #endregion check

            // save changes
            context.Execute(save);

            #region check

            context.Changes.CheckCount(0);

            order1.CheckUnchanged();
            customer1.CheckUnchanged();
            orderDetail1.CheckUnchanged();

            customer1.Orders.CheckCount(1).CheckItem(0, order1);

            order1.Customer.Check(customer1);
            order1.CustomerID.Check(customer1.ID);
            order1.OrderDetails.CheckCount(1).CheckItem(0, orderDetail1);

            orderDetail1.Order.Check(order1);
            orderDetail1.OrderID.Check(order1.ID);

            order1.GetChangedProperties().CheckCount(0);
            customer1.GetChangedProperties().CheckCount(0);
            orderDetail1.GetChangedProperties().CheckCount(0);

            #endregion check

            // Add shipment1
            Shipment shipment1 = new Shipment();
            context.Shipments.Add(shipment1);

            // Add order2
            Order order2 = new Order();
            context.Orders.Add(order2);

            // Modify orderDetail1
            orderDetail1.Order = order2;

            // Add orderDetail2
            OrderDetail orderDetail2 = new OrderDetail();
            orderDetail2.Order = order2;
            context.OrderDetails.Add(orderDetail2);

            // Modify order1
            order1.Customer = null;

            // Add customer2
            Customer customer2 = new Customer();
            customer2.FirstName = "customer2";
            context.Customers.Add(customer2);

            // Modify customer1
            customer1.SecondPartner = customer2;

            // Modify order1
            order1.Customer = customer2;

            shipment1.Order = order2;

            // Add customer3
            Customer customer3 = new Customer();
            customer3.FirstName = "customer3";
            context.Customers.Add(customer3);

            customer2.FirstPartner = customer3;

            // Delete customer1
            context.Customers.Remove(customer1);

            order2.Customer = customer2;

            // Modify order1
            order1.Customer = customer3;

            #region check

            order2.CheckAdded();
            shipment1.CheckAdded();
            customer2.CheckAdded();
            customer3.CheckAdded();
            orderDetail2.CheckAdded();

            customer1.CheckDeleted();

            order1.CheckModified();
            order1.Customer.Check(customer3);
            order1.CustomerID.Check(customer3.ID);
            order1.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

            orderDetail1.CheckModified();
            orderDetail1.Order.Check(order2);
            orderDetail1.OrderID.Check(order2.ID);
            orderDetail1.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.OrderID);

            context.Changes.CheckCount(8)
            .CheckFound(order1)
            .CheckFound(order2)
            .CheckFound(shipment1)
            .CheckFound(customer1)
            .CheckFound(customer2)
            .CheckFound(customer3)
            .CheckFound(orderDetail1)
            .CheckFound(orderDetail2);

            #endregion check

            #region delete orderDetail1 & order1

            void delete()
            {
                EntityDatabaseConnection connection = GetConnection();

                connection.Open();

                Database.Connect(connection)
                .Prepared()
                .WithParameters(new { OrderDetailID = orderDetail1.ID, OrderID = order1.ID })
                .Query(@"set nocount on;
                                 
                                 delete 
                                 from OrderDetails
                                 where ID = @OrderDetailID

                                 delete 
                                 from Orders
                                 where ID = @OrderID

                                ")
                .Execute();

                connection.Close();
            }

            delete();

            #endregion delete orderDetail1 & order1

            try
            {
                // save changes
                context.Execute(save);
            }
            catch (EntityDatabaseConcurrencyException) when(hasConcurrency && !hasConflict)
            {
                // it's ok, concurrency was occurred
            }
            catch (EntityDatabaseConcurrencyException e) when(hasConcurrency && hasConflict && ((SqlException)e.InnerException).Number == 547)
            {
                // it's ok, concurrency was occurred
            }

            #region check

            if (hasConcurrency)
            {
                order2.CheckAdded();
                shipment1.CheckAdded();
                customer2.CheckAdded();
                customer3.CheckAdded();
                orderDetail2.CheckAdded();

                customer1.CheckDeleted();

                order1.CheckModified();
                order1.Customer.Check(customer3);
                order1.CustomerID.Check(customer3.ID);
                order1.GetChangedProperties().CheckCount(1).CheckFound <Order>(o => o.CustomerID);

                orderDetail1.CheckModified();
                orderDetail1.Order.Check(order2);
                orderDetail1.OrderID.Check(order2.ID);
                orderDetail1.GetChangedProperties().CheckCount(1).CheckFound <OrderDetail>(od => od.OrderID);

                context.Changes.CheckCount(8)
                .CheckFound(order1)
                .CheckFound(order2)
                .CheckFound(shipment1)
                .CheckFound(customer1)
                .CheckFound(customer2)
                .CheckFound(customer3)
                .CheckFound(orderDetail1)
                .CheckFound(orderDetail2);
            }
            else
            {
                order1.CheckUnchanged();
                order2.CheckUnchanged();
                shipment1.CheckUnchanged();
                customer2.CheckUnchanged();
                customer3.CheckUnchanged();
                orderDetail1.CheckUnchanged();
                orderDetail2.CheckUnchanged();

                customer1.CheckDetached();

                order1.Customer.Check(customer3);
                order1.CustomerID.Check(customer3.ID);
                order1.GetChangedProperties().CheckCount(0);
                order1.OrderDetails.CheckCount(0);
                order1.Shipment.CheckItem(null);

                order2.Customer.Check(customer2);
                order2.CustomerID.Check(customer2.ID);
                order2.GetChangedProperties().CheckCount(0);
                order2.OrderDetails.CheckCount(2).CheckItem(0, orderDetail1).CheckItem(1, orderDetail2);
                order2.Shipment.CheckItem(shipment1);

                shipment1.Order.Check(order2);
                shipment1.OrderID.Check(order2.ID);
                shipment1.GetChangedProperties().CheckCount(0);

                customer2.FirstPartner.Check(customer3);
                customer2.FirstPartnerID.Check(customer3.ID);
                customer2.SecondPartner.Check(null);
                customer2.SecondPartnerID.Check(null);
                customer2.GetChangedProperties().CheckCount(0);
                customer2.Orders.CheckCount(1).CheckItem(0, order2);
                customer2.FirstPartners.CheckCount(0);
                customer2.SecondPartners.CheckCount(0);

                customer3.FirstPartner.Check(null);
                customer3.FirstPartnerID.Check(null);
                customer3.SecondPartner.Check(null);
                customer3.SecondPartnerID.Check(null);
                customer2.GetChangedProperties().CheckCount(0);
                customer3.Orders.CheckCount(1).CheckItem(0, order1);
                customer3.FirstPartners.CheckCount(1).CheckItem(0, customer2);
                customer3.SecondPartners.CheckCount(0);

                orderDetail1.Order.Check(order2);
                orderDetail1.OrderID.Check(order2.ID);
                orderDetail1.GetChangedProperties().CheckCount(0);

                orderDetail2.Order.Check(order2);
                orderDetail2.OrderID.Check(order2.ID);
                orderDetail2.GetChangedProperties().CheckCount(0);

                context.Changes.CheckCount(0);
            }

            #endregion check
        }