private EFCustomer GetComplexCustomerInfo()
        {
            var customer = new EFCustomer
            {
                Address  = new EFAddress("China", "SH", "SH", "A street", "12345"),
                UserName = "******",
                Phone    = "111111",
                Password = "******",
                EFNote   = new List <EFNote>
                {
                    new EFNote {
                        NoteText = "AA"
                    },
                    new EFNote
                    {
                        NoteText  = "BB",
                        ChildNote = new List <ChildNote>
                        {
                            new ChildNote {
                                Title = "XXX"
                            },
                            new ChildNote {
                                Title = "YYY"
                            }
                        }
                    }
                }
            };

            return(customer);
        }
        private void InsertNewCustomer(EFCustomer customer)
        {
            using (var custRepo = new CustomerRepository())
            {
                var actual = custRepo.GetAll().ToList().Count;
                //actual.Should().Be(0);

                custRepo.Insert(customer);
                custRepo.RepoContext.Commit();
            }
        }
        public void ef_update_by_auto_complex_compare_test()
        {
            var customer = GetComplexCustomerInfo();

            InsertNewCustomer(customer);

            var cInfo = new EFCustomer();

            using (var repo = new CustomerRepository())
            {
                cInfo = repo.GetCustomFullInfo(1);
            }

            var updateInfo = cInfo.DeepCopy();

            updateInfo.Email        = "*****@*****.**";
            updateInfo.Phone        = null;
            updateInfo.Address.City = "SZ";
            updateInfo.EFNote.First().NoteText = "DDDD";
            var newNotes = updateInfo.EFNote;
            var note     = newNotes.Last();

            newNotes.Remove(note);
            updateInfo.EFNote = newNotes;
            var childList = updateInfo.EFNote.First().ChildNote;
            var cNote     = childList.First();

            childList.Remove(cNote);
            childList.First().Title = "MMM";
            childList.Add(new ChildNote {
                Title = "ZZZ"
            });
            updateInfo.EFNote.Add(new EFNote {
                NoteText = "CCCC"
            });

            var result = new CompareLogic().Compare(updateInfo, cInfo);

            using (var repo = new CustomerRepository())
            {
                repo.Update(updateInfo);
                repo.RepoContext.Commit();
            }
            using (var repo = new CustomerRepository())
            {
                var newInfo = repo.GetCustomFullInfo(1);
                newInfo.Email.Should().Be("*****@*****.**");
                newInfo.EFNote.Count().Should().Be(2);
                var newChilds = newInfo.EFNote.First().ChildNote;
                newChilds.Count.Should().Be(2);
                newChilds.First().Title.Should().Be("MMM");
                newChilds.Last().Title.Should().Be("ZZZ");
            }
        }
        public void ef_update_by_manual_compare_test()
        {
            var customer = GetCustomerInfo();

            InsertNewCustomer(customer);
            var cInfo = new EFCustomer();

            using (var repo = new CustomerRepository())
            {
                cInfo = repo.GetCustomFullInfo(1);
            }

            cInfo.Email        = "*****@*****.**";
            cInfo.Address.City = "SZ";
            cInfo.Address.Zip  = "000000000";
            cInfo.ObjectState  = ObjectStateType.Modified;
            cInfo.EFNote.First().NoteText    = "DDDD";
            cInfo.EFNote.First().ObjectState = ObjectStateType.Modified;
            cInfo.EFNote.Last().ObjectState  = ObjectStateType.Deleted;
            cInfo.EFNote.Add(new EFNote {
                NoteText = "CCCC", ObjectState = ObjectStateType.Added
            });

            using (var repo = new CustomerRepository())
            {
                repo.Update(cInfo);
                repo.RepoContext.Commit();
            }

            using (var repo = new CustomerRepository())
            {
                cInfo = repo.GetCustomFullInfo(1);
                var all = repo.GetAll();
                all.Count().Should().Be(1);
            }
            cInfo.Email.Should().Be("*****@*****.**");
            var address = cInfo.Address;

            address.City.Should().Be("SZ");
            address.Zip.Should().Be("000000000");
            cInfo.EFNote.Count.Should().Be(2);
            cInfo.EFNote.Last().NoteText.Should().Be("CCCC");
            cInfo.EFNote.First().NoteText.Should().Be("DDDD");
        }
        public void ef_update_by_auto_compare_by_ilist_test()
        {
            var customer = GetCustomerInfo();

            InsertNewCustomer(customer);
            var cInfo = new EFCustomer();

            using (var repo = new CustomerRepository())
            {
                cInfo        = repo.GetCustomFullInfo(1);
                cInfo.EFNote = cInfo.EFNote.ToList();
            }

            var updateInfo = cInfo.DeepCopy();

            updateInfo.Email        = "*****@*****.**";
            updateInfo.Phone        = null;
            updateInfo.Address.City = "SZ";
            updateInfo.EFNote.First().NoteText = "DDDD";
            var newNotes = updateInfo.EFNote.ToList();

            newNotes.RemoveAll(p => p.Id == 2);
            updateInfo.EFNote = newNotes;
            updateInfo.EFNote.Add(new EFNote {
                NoteText = "CCCC"
            });

            var result = new CompareLogic().Compare(updateInfo, cInfo);

            using (var repo = new CustomerRepository())
            {
                repo.Update(updateInfo);
                repo.RepoContext.Commit();
            }
            using (var repo = new CustomerRepository())
            {
                var newInfo = repo.GetCustomFullInfo(1);
                newInfo.Email.Should().Be("*****@*****.**");
                newInfo.EFNote.Count().Should().Be(2);
            }
        }
        public void ef_update_by_partial_test()
        {
            var customer = GetCustomerInfo();

            InsertNewCustomer(customer);
            var cInfo = new EFCustomer();

            using (var repo = new CustomerRepository())
            {
                cInfo = repo.GetCustomFullInfo(1);
            }

            cInfo.SetUpdate(() => cInfo.Address.City, "SZ");
            cInfo.SetUpdate(() => cInfo.Address.Zip, "000000000");
            cInfo.SetUpdate(() => cInfo.Email, "*****@*****.**");

            var firstNote = cInfo.EFNote.First();

            firstNote.SetUpdate(() => firstNote.NoteText, "DDDD");

            using (var repo = new CustomerRepository())
            {
                repo.Update(cInfo);
                repo.RepoContext.Commit();
            }

            using (var repo = new CustomerRepository())
            {
                cInfo = repo.GetCustomFullInfo(1);
            }
            cInfo.Email.Should().Be("*****@*****.**");
            var address = cInfo.Address;

            address.City.Should().Be("SZ");
            address.Zip.Should().Be("000000000");
            cInfo.EFNote.Count.Should().Be(2);
            cInfo.EFNote.Last().NoteText.Should().Be("BB");
            cInfo.EFNote.First().NoteText.Should().Be("DDDD");
        }