public void CanBinarySerializeNorthwindDatabase( )
        {
            var serializer = new Binary.BinaryDbContextSerializer( );

            using var serverContext = fixture.CreateDbContext( );

            var orders = serverContext.Customers
                         .Include(customer => customer.Orders)
                         .ThenInclude(order => order.OrderDetails)
                         .ThenInclude(orderDetail => orderDetail.Product)
                         .ToList( );

            var employees = serverContext.Employees.ToList( );

            serverContext.Serialize(serializer, out var serializedContext);

            Assert.Equal(104660, serializedContext.Length);

            using var clientContext = fixture.CreateDisconnectedDbContext( );

            var deserialized = clientContext.Deserialize(serializer, serializedContext);

            Assert.Equal(serverContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         clientContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         EntityEntryComparer.Instance);
        }
        public void CanCompleteBinaryServerClientWorkflow( )
        {
            var serializer = new Binary.BinaryDbContextSerializer( );

            using var fixture = new Fixture( );

            using var serverContext = fixture.CreateDbContext( );

            var customer = serverContext.Customers.Include(c => c.Orders).First( );

            serverContext.SerializeGraph(serializer, out var graph, customer);

            using var clientContext = fixture.CreateDisconnectedDbContext( );

            clientContext.Deserialize(serializer, graph);

            Assert.Equal(serverContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         clientContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         EntityEntryComparer.Instance);

            customer             = clientContext.Find <Customer> (customer.CustomerID);
            customer.ContactName = "Would prefer not to be contacted";

            customer.Orders.RemoveAt(3);

            clientContext.Remove(customer.Orders [3]);

            var newCustomer = new Customer {
                CustomerID = "NOPE",
                Country    = "Canada",
                Orders     = new List <Order> {
                    new Order {
                        OrderDate = DateTime.UtcNow
                    }
                }
            };

            clientContext.Customers.Add(newCustomer);

            clientContext.SerializeChanges(serializer, out var changes);

            serverContext.Deserialize(serializer, changes);

            Assert.Equal(serverContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         clientContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         EntityEntryComparer.Instance);

            serverContext.SaveChanges(serializer, out var databaseGeneratedValues);

            clientContext.AcceptChanges(serializer, databaseGeneratedValues);

            Assert.All(serverContext.ChangeTracker.Entries( ),
                       entry => Assert.True(entry.State == EntityState.Unchanged));

            Assert.All(clientContext.ChangeTracker.Entries( ),
                       entry => Assert.True(entry.State == EntityState.Unchanged));

            Assert.Equal(serverContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         clientContext.ChangeTracker.Entries( ).OrderBy(entry => entry, EntityEntryComparer.Instance),
                         EntityEntryComparer.Instance);
        }