public void BulkMerge_Options_Default()
        {
            TestDbContext dbContext = new TestDbContext();

            SetupData(dbContext, true);
            var orders         = dbContext.Orders.Where(o => o.Id <= 10000).OrderBy(o => o.Id).ToList();
            int ordersToAdd    = 5000;
            int ordersToUpdate = orders.Count;

            foreach (var order in orders)
            {
                order.Price = Convert.ToDecimal(order.Id + .25);
            }
            for (int i = 0; i < ordersToAdd; i++)
            {
                orders.Add(new Order {
                    Id = 100000 + i, Price = 3.55M
                });
            }
            var result = dbContext.BulkMerge(orders, new BulkMergeOptions <Order>
            {
                MergeOnCondition = (s, t) => s.Id == t.Id,
                BatchSize        = 1000
            });
            var  newOrders              = dbContext.Orders.OrderBy(o => o.Id).ToList();
            bool areAddedOrdersMerged   = true;
            bool areUpdatedOrdersMerged = true;

            foreach (var newOrder in newOrders.Where(o => o.Id <= 10000).OrderBy(o => o.Id))
            {
                if (newOrder.Price != Convert.ToDecimal(newOrder.Id + .25))
                {
                    areUpdatedOrdersMerged = false;
                    break;
                }
            }
            foreach (var newOrder in newOrders.Where(o => o.Id >= 500000).OrderBy(o => o.Id))
            {
                if (newOrder.Price != 3.55M)
                {
                    areAddedOrdersMerged = false;
                    break;
                }
            }

            Assert.IsTrue(result.RowsAffected == orders.Count(), "The number of rows inserted must match the count of order list");
            Assert.IsTrue(result.RowsUpdated == ordersToUpdate, "The number of rows updated must match");
            Assert.IsTrue(result.RowsInserted == ordersToAdd, "The number of rows added must match");
            Assert.IsTrue(areAddedOrdersMerged, "The orders that were added did not merge correctly");
            Assert.IsTrue(areUpdatedOrdersMerged, "The orders that were updated did not merge correctly");
        }
        public void BulkMerge_Options_AutoMapIdentity()
        {
            TestDbContext dbContext = new TestDbContext();

            SetupData(dbContext, true);
            int ordersToUpdate = 3;
            int ordersToAdd    = 2;
            var orders         = new List <Order>
            {
                new Order {
                    ExternalId = "id-1", Price = 7.10M
                },
                new Order {
                    ExternalId = "id-2", Price = 9.33M
                },
                new Order {
                    ExternalId = "id-3", Price = 3.25M
                },
                new Order {
                    ExternalId = "id-1000001", Price = 2.15M
                },
                new Order {
                    ExternalId = "id-1000002", Price = 5.75M
                },
            };
            var result = dbContext.BulkMerge(orders, new BulkMergeOptions <Order>
            {
                MergeOnCondition  = (s, t) => s.ExternalId == t.ExternalId,
                UsePermanentTable = true
            });
            bool autoMapIdentityMatched = true;

            foreach (var order in orders)
            {
                if (!dbContext.Orders.Any(o => o.ExternalId == order.ExternalId && o.Id == order.Id && o.Price == order.Price))
                {
                    autoMapIdentityMatched = false;
                    break;
                }
            }

            Assert.IsTrue(result.RowsAffected == ordersToAdd + ordersToUpdate, "The number of rows inserted must match the count of order list");
            Assert.IsTrue(result.RowsUpdated == ordersToUpdate, "The number of rows updated must match");
            Assert.IsTrue(result.RowsInserted == ordersToAdd, "The number of rows added must match");
            Assert.IsTrue(autoMapIdentityMatched, "The auto mapping of ids of entities that were merged failed to match up");
        }