public void EntityVesrsionTestWithRelatioship()
        {
            using (var testRep = new TestRepository())
            {
                testRep.Database.Delete();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                testRep.Add(new Address { Street = "HomeStreet" });
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet").FirstOrDefault();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet").FirstOrDefault();
                if (address != null)
                {
                    address.Street = "HomeStreet02";
                }
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                Assert.IsTrue(testRep.Query<Address>(a => a.Street.Contains("Street")).Count() == 1);
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet02").FirstOrDefault();
                address.Persons = new List<Person> { new Person { Name = "PersonOne" }, new Person { Name = "Persontwo" }, new Person { Name = "Personthree" } };
                testRep.SaveChanges();

            }
            using (ITestRepository testRep = new TestRepository())
            {
                Assert.IsTrue(testRep.Query<Address>(a => a.Street.Contains("Street")).Count() == 1);
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet02").FirstOrDefault();
                Assert.IsTrue(address != null && address.VersionNo == 2);
            }
        }
        public void EntityDeleteTestForEagerLoad()
        {
            using (var testRep = new TestRepository())
            {
                testRep.Database.Delete();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var personOne = new Person {Name = "PersonOne"};
                var personTwo = new Person { Name = "PersonTwo" };
                var personThree = new Person { Name = "PersonThree" };

                var addressHome = new Address
                    {
                        Street = "HomeStreet",
                        Persons = new List<Person> {personOne, personTwo, personThree}
                    };
                Assert.IsTrue(addressHome.Persons.Count == 3, "Soft delete test failed expectation");

                testRep.Add(addressHome);
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var personOne = testRep.Query<Person>(p => p.Name == "PersonOne").FirstOrDefault();
                var addressHome = testRep.Query<Address>(a => a.Street.Contains("HomeStreet"), a => a.Persons).FirstOrDefault();
                Assert.IsTrue(addressHome.Persons.Count == 3, "Soft delete test failed expectation");
                testRep.Delete(personOne);
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var addressHome = testRep.Query<Address>(a => a.Street.Contains("HomeStreet"), a => a.Persons).FirstOrDefault();
                if (addressHome == null) throw new Exception("Soft delete test failed, addressHome is null");
                Assert.IsTrue(addressHome.Persons.Count == 2, "Soft delete test failed expectation");
            }

        }
        public void EntityVesrsionTestWithAutoIncrement()
        {
            using (var testRep = new TestRepository())
            {
                testRep.Database.Delete();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                testRep.Add(new Address { Street = "HomeStreet" });
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet").FirstOrDefault();
                Assert.IsTrue(address != null && address.VersionNo == 1);
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet").FirstOrDefault();
                if (address != null)
                {
                    address.Street = "HomeStreet02";
                }
                testRep.SaveChanges();

                Assert.IsTrue(address != null && address.VersionNo == 2);
            }

            using (ITestRepository testRep = new TestRepository())
            {

                Assert.IsTrue(testRep.Query<Address>(a => a.Street.Contains("Street")).Count() == 1);
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet02").FirstOrDefault();
                Assert.IsTrue(address != null && address.VersionNo == 2);
            }
        }
        public void EntityDeleteTestForQuery()
        {
            using (var testRep = new TestRepository())
            {
                testRep.Database.Delete();
            }

            using (IRepository testRep = new TestRepository())
            {
                var personOne = new Person { Name = "PersonOne" };
                var personTwo = new Person { Name = "PersonTwo" };
                var personThree = new Person { Name = "PersonThree" };

                var addressHome = new Address
                {
                    Street = "HomeStreet",
                    Persons = new List<Person> { personOne, personTwo, personThree }
                };
                Assert.IsTrue(addressHome.Persons.Count == 3, "Soft delete test failed expectation");

                testRep.Add(addressHome);
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var personOne = testRep.Query<Person>(p => p.Name == "PersonOne").FirstOrDefault();
                Assert.IsNotNull(personOne, "Soft delete test failed expectation");
                testRep.Delete(personOne);
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var personOne = testRep.Query<Person>(p => p.Name == "PersonOne").FirstOrDefault();
                Assert.IsNull(personOne, "Soft delete test failed expectation");
            }
        }
        public void EntityVesrsionRetrivalInObjectGraph()
        {
            using (var testRep = new TestRepository())
            {
                testRep.Database.Delete();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                testRep.Add(new Address { Street = "HomeStreet" });
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet").FirstOrDefault();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet").FirstOrDefault();
                if (address != null)
                {
                    address.Street = "HomeStreet02";
                }
                testRep.SaveChanges();
            }

            using (ITestRepository testRep = new TestRepository())
            {
                Assert.IsTrue(testRep.Query<Address>(a => a.Street.Contains("Street")).Count() == 1);
                var address = testRep.Query<Address>(a => a.Street == "HomeStreet02").FirstOrDefault();
                address.Persons = new List<Person> { new Person { Name = "PersonOne" }, new Person { Name = "Persontwo" }, new Person { Name = "Personthree" } };
                testRep.SaveChanges();

            }
            using (ITestRepository testRep = new TestRepository())
            {

                var address = testRep.Query<Address>(a => a.Street.Contains("Street")).FirstOrDefault();
                address.Street = "HomeStreet03";
                testRep.SaveChanges();
            }


            using (ITestRepository testRep = new TestRepository())
            {

                var person = testRep.Query<Person>(p => p.Name.Contains("PersonOne"), p => p.Address).FirstOrDefault();
                Assert.IsTrue(person.Address.Street == "HomeStreet02");
                testRep.SaveChanges();
            }

        }