public void QueryNestedPropertyWithProxy()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Hallo" };
                p1.Addresses.Add(new Adresse()
                {
                    Name = "Myaddress"
                });
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
            }

            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();
                var p = ctx.Persons.FirstOrDefault();
                Assert.That(p.Addresses.Count, Is.EqualTo(1));
            }
        }
        public void QueryTwoDifferentTables()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Hallo" };
                p1.Addresses.Add(new Adresse()
                {
                    Name = "Myaddress"
                });
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
            }

            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();
                var p = ctx.Persons.FirstOrDefault();
                var adr = ctx.Adresses.FirstOrDefault();
                Assert.That(p.Addresses.First() == adr);
            }
        }
        public void GetItemTwice()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var person = new Person
                {
                    Name = "Eintrag"
                };
                ctx.Persons.Add(person);
                ctx.SaveChanges();

                var dbEntry = ctx.Persons.FirstOrDefault(x => x.Id == 1);
                Assert.That(person, Is.SameAs(dbEntry));
                Assert.That(person.Id, Is.EqualTo(dbEntry.Id));
            }
        }
        public void TestJoinOperation()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();
                var person = new Person
                {
                    Name = "Eintrag"
                };

                foreach (var adr in Enumerable.Range(0, 10).Select(x => new Adresse { Name = x.ToString() }))
                    person.Addresses.Add(adr);

                ctx.Persons.Add(person);
                ctx.SaveChanges();

                var query = from p in ctx.Persons
                            from a in ctx.Adresses
                            where p.Id == a.Id
                            select a;

                Assert.That(ctx.Persons.Count(), Is.EqualTo(1));
                Assert.That(ctx.Adresses.Count(), Is.EqualTo(10));
                Assert.That(query.Count(), Is.EqualTo(1));
            }
        }
        public void SameInstancesInContext()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();
                var p1 = new Person { Name = "Jürgen" };
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
            }
            using (var ctx = new MyTestDbContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                ctx.SetupAsTestDbContext();

                var p1 = ctx.Persons.FirstOrDefault();
                var p2 = ctx.Persons.FirstOrDefault();
                Assert.That(p1 == p2);
            }
        }
        public void DeleteItem()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Jürgen" };
                ctx.Persons.Add(p1);
                ctx.SaveChanges();

                var p = ctx.Persons.FirstOrDefault(x => x.Id == 1);
                ctx.Persons.Remove(p);
                ctx.SaveChanges();

                Assert.That(ctx.Persons.Count(), Is.EqualTo(0));
            }
        }
        public void FindMethod()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Jürgen" };
                ctx.Persons.Add(p1);
                ctx.SaveChanges();

                var p = ctx.Persons.Find(1);
                Assert.That(p.Name, Is.EqualTo(p1.Name));
            }
        }
        public void UseTwoDifferentContexts()
        {
            using (var ctx1 = new MyTestDbContext())
            {
                ctx1.SetupAsTestDbContext();

                var p1 = new Person { Name = "Jürgen" };
                p1.Addresses.Add(new Adresse { Name = "AlterWert1" });
                p1.Addresses.Add(new Adresse { Name = "AlterWert2" });
                ctx1.Persons.Add(p1);
                ctx1.SaveChanges();
            }

            using (var ctx2 = new MyTestDbContext())
            {
                ctx2.SetupAsTestDbContext();
                var persons = ctx2.Persons;

                Assert.AreEqual(2, persons.First().Addresses.Count());
            }

            Person p2;
            using (var ctx3 = new MyTestDbContext())
            {
                ctx3.SetupAsTestDbContext();
                p2 = ctx3.Persons.FirstOrDefault(x => x.Id == 1);
                p2.Name = "ÜberschriebenerWert";
                p2.Addresses.First().Name = "Hallo";
            }

            using (var ctx4 = new MyTestDbContext())
            {
                ctx4.SetupAsTestDbContext();
                ctx4.Entry(p2).State = EntityState.Modified;
                ctx4.SaveChanges();
            }

            using (var ctx5 = new MyTestDbContext())
            {
                ctx5.SetupAsTestDbContext();
                var p3 = ctx5.Persons.FirstOrDefault(x => x.Id == 1);


                Assert.That(p2, Is.Not.EqualTo(p3));
                Assert.That(p3.Name, Is.EqualTo("ÜberschriebenerWert"));
                Assert.That(p3.Addresses.First().Name, Is.EqualTo("AlterWert1"));
            }
        }
        public void AddTwoUniqueEntries()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Hallo" };
                ctx.Persons.Add(p1);
                ctx.SaveChanges();

                var p2 = new Person { Name = "Jürgen" };
                ctx.Persons.Add(p2);
                ctx.SaveChanges();

                Assert.That(p1.Id, Is.EqualTo(1));
                Assert.That(p2.Id, Is.EqualTo(2));
            }
        }
        public void QueryNestedPropertyWithNoProxyAndIncludeTwoLevel()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person
                {
                    Name = "Hallo1",
                    ChildPerson = new Person
                    {
                        Name = "Hallo2",
                        Addresses = new List<Adresse>()
                        {
                          new Adresse()
                          {
                              Name = "Adr"
                          }  
                        },
                        ChildPerson = new Person
                        {
                            Name = "Hallo3"
                        }
                    }
                };
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
            }

            using (var ctx = new MyTestDbContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                ctx.SetupAsTestDbContext();

                var p = ctx.Persons.Include(x => x.ChildPerson.Addresses).FirstOrDefault();
                Assert.That(p.ChildPerson.Addresses.Count, Is.EqualTo(1));
            }
        }
        public void QueryNestedPropertyWithNoProxyAndIncludeOneLevel()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person
                {
                    Name = "Hallo1",
                    ChildPerson = new Person
                    {
                        Name = "Hallo2",
                        ChildPerson = new Person
                        {
                            Name = "Hallo3"
                        }
                    }
                };
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
            }

            using (var ctx = new MyTestDbContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                ctx.SetupAsTestDbContext();

                var p = ctx.Persons.Include(x => x.ChildPerson).FirstOrDefault();
                Assert.That(p.ChildPerson, Is.Not.Null);
            }
        }
        public void QueryNestedPropertyWithNoProxyAndInclude()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Hallo" };
                p1.Addresses.Add(new Adresse()
                {
                    Name = "Myaddress"
                });
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
            }

            using (var ctx = new MyTestDbContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                ctx.SetupAsTestDbContext();

                var p = ctx.Persons.Include(x => x.Addresses).FirstOrDefault();
                Assert.That(p.Addresses.Count, Is.EqualTo(1));
            }
        }
        public void QueryNoProxyEnsureId()
        {
            int id = 0;
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Hallo" };
                p1.Addresses.Add(new Adresse()
                {
                    Name = "Myaddress"
                });
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
                id = p1.Addresses.FirstOrDefault().Id;
            }

            using (var ctx = new MyTestDbContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                ctx.SetupAsTestDbContext();
                var p = ctx.Persons.Include(x => x.Addresses).FirstOrDefault();
                Assert.That(p.Addresses.FirstOrDefault().Id, Is.EqualTo(id));
            }
        }
        public void AddPersonWithAddressesSelectMany()
        {
            using (var ctx = new MyTestDbContext())
            {
                ctx.SetupAsTestDbContext();

                var p1 = new Person { Name = "Hallo" };
                for (int i = 0; i < 3; i++)
                {
                    p1.Addresses.Add(new Adresse()
                    {
                        Name = "Myaddress" + i
                    });
                }
                ctx.Persons.Add(p1);
                ctx.SaveChanges();
            }

            using (var ctx = new MyTestDbContext())
            {
                ctx.Configuration.ProxyCreationEnabled = false;
                ctx.SetupAsTestDbContext();
                var adr = ctx.Persons
                    .AsNoTracking()
                    .Where(x => x.Id > 0)
                    .Where(x => x.Id < 1000)
                    .SelectMany(x => x.Addresses)
                    .FirstOrDefault(x => x.Id == 2);
                Assert.That(adr, Is.Not.Null);
            }
        }