Пример #1
0
        public void OneToManyWhereTheOneAlreadyExists()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                Parity even = new Parity {
                    Name = "Even", UpdatedAt = now, UpdatedBy = "Måns"
                };
                Parity odd = new Parity {
                    Name = "Odd", UpdatedAt = now, UpdatedBy = "Måns"
                };
                db.BulkInsertAll(new[] { even, odd });

                var numbers = GenerateNumbers(1, 100, even, odd, now).ToArray();
                db.BulkInsertAll(numbers);

                Assert.AreEqual(100, db.Numbers.Count());

                var dbNumbers = db.Numbers.Include(n => n.Parity).ToArray();
                foreach (var number in dbNumbers.Where(n => n.Value % 2 == 0))
                {
                    Assert.AreEqual("Even", number.Parity.Name);
                    Assert.AreEqual(now.ToString("yyyyMMddHHmmss"), number.UpdatedAt.ToString("yyyyMMddHHmmss"));
                }

                foreach (var number in dbNumbers.Where(n => n.Value % 2 != 0))
                {
                    Assert.AreEqual("Odd", number.Parity.Name);
                    Assert.AreEqual(now.ToString("yyyyMMddHHmmss"), number.UpdatedAt.ToString("yyyyMMddHHmmss"));
                }
            }
        }
Пример #2
0
        public void EntityHierarchyShouldBeInserted()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                var numbers = GenerateNumbers(1, 10, now).ToArray();  // 1-10
                var primes  = GeneratePrimeNumbers(10, numbers, now); // 1,2,3,5,7

                var request = new BulkInsertRequest <Prime>
                {
                    Entities  = primes,
                    Recursive = true,
                };
                db.BulkInsertAll(request);

                var actualNumbers = db.Numbers.ToArray();
                var actualPrimes  = db.Primes.ToArray();

                Assert.AreEqual(5, actualNumbers.Length);
                Assert.AreEqual(5, actualPrimes.Length);
                Assert.AreEqual(1, actualPrimes[0].Number.Value);
                Assert.AreEqual(2, actualPrimes[1].Number.Value);
                Assert.AreEqual(3, actualPrimes[2].Number.Value);
                Assert.AreEqual(5, actualPrimes[3].Number.Value);
                Assert.AreEqual(7, actualPrimes[4].Number.Value);
            }
        }
Пример #3
0
        public void ExistingEntitiesShouldBeSelectedUsingRuntimeTypes()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                // Save 200 numbers (1 to 200) to the database.
                var numbers = GenerateNumbers(1, 200, now).ToArray();
                db.BulkInsertAll(new BulkInsertRequest <Number>
                {
                    Entities  = numbers,
                    Recursive = true
                });

                // Create a list of 100 numbers with values 151 to 250
                numbers = GenerateNumbers(151, 100, now).ToArray();

                // Numbers 151 to 200 out of 151 to 250 should be selected.
                var request = typeof(BulkSelectRequest <>).MakeGenericType(typeof(Number));
                var r       = Activator.CreateInstance(request, new[] { "Value" }, numbers.ToList(), null);

                Type       ex              = typeof(DbContextExtensions);
                MethodInfo mi              = ex.GetMethod("BulkSelectExisting");
                MethodInfo miGeneric       = mi.MakeGenericMethod(new[] { typeof(Number), typeof(Number) });
                object[]   args            = { db, r };
                var        existingNumbers = (List <Number>)miGeneric.Invoke(null, args);

                Assert.AreEqual(50, existingNumbers.Count);
                for (int i = 0; i < 50; i++)
                {
                    Assert.AreSame(numbers[i], existingNumbers[i]);
                }
            }
        }
        public void EntitiesOfSameTypeMatchingExistingEntitiesShouldBeSelected()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                var numbers = GenerateNumbers(1, 200, now).ToArray();
                db.BulkInsertAll(new BulkInsertRequest <Number>
                {
                    Entities  = numbers,
                    Recursive = true
                });


                numbers = GenerateNumbers(50, 100, now).ToArray();
                var existingNumbers = db.BulkSelectExisting <Number, Number>(new BulkSelectRequest <Number>
                {
                    Items = numbers,
                    KeyPropertyMappings = new[]
                    {
                        new KeyPropertyMapping
                        {
                            ItemPropertyName   = "Value",
                            EntityPropertyName = "Value"
                        },
                    }
                });

                for (int i = 0; i < 100; i++)
                {
                    Assert.AreSame(numbers[i], existingNumbers[i]);
                }
            }
        }
Пример #5
0
        public void OneToManyWhereAllIsNew()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                var numbers = GenerateNumbers(1, 100, now).ToArray();
                var request = new BulkInsertRequest <Number>
                {
                    Entities = numbers,
                    EnableRecursiveInsert = EnableRecursiveInsert.Yes,
                };
                db.BulkInsertAll(request);

                Assert.AreEqual(100, db.Numbers.Count());

                var dbNumbers = db.Numbers.Include(n => n.Parity).ToArray();
                foreach (var number in dbNumbers.Where(n => n.Value % 2 == 0))
                {
                    Assert.AreEqual("Even", number.Parity.Name);
                    Assert.AreEqual(now.ToString("yyyyMMddHHmmss"), number.UpdatedAt.ToString("yyyyMMddHHmmss"));
                }

                foreach (var number in dbNumbers.Where(n => n.Value % 2 != 0))
                {
                    Assert.AreEqual("Odd", number.Parity.Name);
                    Assert.AreEqual(now.ToString("yyyyMMddHHmmss"), number.UpdatedAt.ToString("yyyyMMddHHmmss"));
                }
            }
        }
Пример #6
0
        public void EntityHierarchyShouldBeInserted()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                var parities = new[]
                {
                    new Parity {
                        Name = "Even", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                    new Parity {
                        Name = "Odd", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                };

                var numbers = GenerateNumbers(1, 100, parities[0], parities[1], now).ToArray();
                var primes  = GeneratePrimeNumbers(100, numbers, now);

                var request = new BulkInsertRequest <Prime>
                {
                    Entities  = primes,
                    Recursive = true,
                };
                db.BulkInsertAll(request);
            }
        }
Пример #7
0
        public void ComplexTypesShouldBeInserted()
        {
            using (var db = new NumberContext())
            {
                // The level entities are used to test EF complex types.
                var expectedLevels = new[]
                {
                    new Level1
                    {
                        Level2 = new Level2
                        {
                            Level2Name = "L2",
                            Level3     = new Level3
                            {
                                Level3Name = "L3",
                                Updated    = new DateTime(2018, 1, 1)
                            }
                        }
                    }
                };
                db.BulkInsertAll(expectedLevels);

                var actualLevels = db.Levels.ToArray();
                Assert.AreEqual(expectedLevels.Length, actualLevels.Length);
                Assert.AreEqual(expectedLevels[0].Id, actualLevels[0].Id);
                Assert.AreEqual(expectedLevels[0].Level2.Level2Name, actualLevels[0].Level2.Level2Name);
                Assert.AreEqual(expectedLevels[0].Level2.Level3.Level3Name, actualLevels[0].Level2.Level3.Level3Name);
                Assert.AreEqual(expectedLevels[0].Level2.Level3.Updated.Ticks, actualLevels[0].Level2.Level3.Updated.Ticks);
            }
        }
Пример #8
0
        public void ExistingEntitiesShouldBeSelectedOnSingleKey()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                var parities = new[]
                {
                    new Parity {
                        Name = "Even", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                    new Parity {
                        Name = "Odd", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                };
                var numbers = GenerateNumbers(1, 200, parities[0], parities[1], now).ToArray();
                db.BulkInsertAll(new BulkInsertRequest <Number>
                {
                    Entities  = numbers,
                    Recursive = true
                });

                var nums = GenerateNumbers(50, 100, parities[0], parities[1], now)
                           .Select(n => new Num {
                    Val = n.Value
                })
                           .ToList();
                var existingNumbers = db.BulkSelect <Num, Number>(new BulkSelectRequest <Num>
                {
                    Items = nums,
                    KeyPropertyMappings = new[]
                    {
                        new KeyPropertyMapping
                        {
                            ItemPropertyName   = "Val",
                            EntityPropertyName = "Value"
                        },
                    }
                });

                var expectedNumbers = numbers.Skip(49).Take(100).ToArray();
                for (int i = 0; i < 100; i++)
                {
                    Assert.AreEqual(expectedNumbers[i].Id, existingNumbers[i].Id);
                    Assert.AreEqual(expectedNumbers[i].ParityId, existingNumbers[i].ParityId);
                    Assert.AreEqual(expectedNumbers[i].UpdatedAt.ToString(CultureInfo.InvariantCulture), existingNumbers[i].UpdatedAt.ToString(CultureInfo.InvariantCulture));
                    Assert.AreEqual(expectedNumbers[i].UpdatedBy, existingNumbers[i].UpdatedBy);
                    Assert.AreEqual(expectedNumbers[i].Value, existingNumbers[i].Value);
                }
            }
        }
        public void ExistingEntitiesShouldBeSelectedOnSingleKey()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                // Save 200 numbers (1 to 200) to the database.
                var numbers = GenerateNumbers(1, 200, now).ToArray();
                db.BulkInsertAll(new BulkInsertRequest <Number>
                {
                    Entities = numbers,
                    EnableRecursiveInsert = EnableRecursiveInsert.Yes
                });

                // Create a list of 100 numbers with values 151 to 250
                var nums = GenerateNumbers(151, 100, now)
                           .Select(n => new Num {
                    Val = n.Value
                })
                           .ToList();

                // Numbers 151 to 200 from the database should be selected.
                var existingNumbers = db.BulkSelect <Num, Number>(new BulkSelectRequest <Num>
                {
                    Items = nums.ToArray(),
                    KeyPropertyMappings = new[]
                    {
                        new KeyPropertyMapping
                        {
                            ItemPropertyName   = "Val",
                            EntityPropertyName = "Value"
                        },
                    }
                }).ToArray();

                Assert.AreEqual(existingNumbers.Length, 50);
                var expectedNumbers = numbers.Skip(150).Take(50).ToArray();

                for (int i = 0; i < 50; i++)
                {
                    Assert.AreEqual(expectedNumbers[i].Id, existingNumbers[i].Id);
                    Assert.AreEqual(expectedNumbers[i].ParityId, existingNumbers[i].ParityId);
                    Assert.AreEqual(expectedNumbers[i].UpdatedAt.ToString(CultureInfo.InvariantCulture), existingNumbers[i].UpdatedAt.ToString(CultureInfo.InvariantCulture));
                    Assert.AreEqual(expectedNumbers[i].UpdatedBy, existingNumbers[i].UpdatedBy);
                    Assert.AreEqual(expectedNumbers[i].Value, existingNumbers[i].Value);
                }
            }
        }
        public void NonExistingEntitiesWithDifferentColumnNameShouldBeSelected()
        {
            using (var db = new NumberContext())
            {
                // Save 200 numbers (1 to 200) to the database.
                var firstParity = new Parity()
                {
                    Name = "Parity#1", UpdatedAt = DateTime.Now, UpdatedBy = "Me"
                };
                var secondParity = new Parity()
                {
                    Name = "Parity#2", UpdatedAt = DateTime.Now, UpdatedBy = "Me"
                };
                db.BulkInsertAll(new BulkInsertRequest <Parity>
                {
                    Entities = new List <Parity> {
                        firstParity, secondParity
                    },
                    EnableRecursiveInsert = EnableRecursiveInsert.Yes
                });

                var thirdParyity = new Parity()
                {
                    Name = "Parity#3", UpdatedAt = DateTime.Now, UpdatedBy = "Me"
                };

                var parities = new List <Parity>();
                parities.AddRange(db.Parities.ToArray());
                parities.Add(thirdParyity);

                List <Parity> nonExistingParity = db.BulkSelectNotExisting <Parity, Parity>(new BulkSelectRequest <Parity>()
                {
                    Items = new List <Parity> {
                        firstParity, secondParity, thirdParyity
                    },
                    KeyPropertyMappings = new[]
                    {
                        new KeyPropertyMapping
                        {
                            ItemPropertyName   = "Id",
                            EntityPropertyName = "Id"
                        },
                    }
                }).ToList();

                Assert.AreEqual(1, nonExistingParity.Count);
            }
        }
Пример #11
0
        public void ItemsMatchingExistingEntitiesShouldBeSelected()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                var parities = new[]
                {
                    new Parity {
                        Name = "Even", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                    new Parity {
                        Name = "Odd", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                };
                var numbers = GenerateNumbers(1, 200, parities[0], parities[1], now).ToArray();
                db.BulkInsertAll(new BulkInsertRequest <Number>
                {
                    Entities  = numbers,
                    Recursive = true
                });


                var nums = GenerateNumbers(50, 100, parities[0], parities[1], now)
                           .Select(n => new Num {
                    Val = n.Value
                })
                           .ToList();
                var existingNumbers = db.BulkSelectExisting <Num, Number>(new BulkSelectRequest <Num>
                {
                    Items = nums,
                    KeyPropertyMappings = new[]
                    {
                        new KeyPropertyMapping
                        {
                            ItemPropertyName   = "Val",
                            EntityPropertyName = "Value"
                        },
                    }
                });

                for (int i = 0; i < 100; i++)
                {
                    Assert.AreSame(nums[i], existingNumbers[i]);
                }
            }
        }
Пример #12
0
        public void ExistingEntitiesShouldBeSelectedOnSingleKey()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                var numbers = GenerateNumbers(1, 200, now).ToArray();
                db.BulkInsertAll(new BulkInsertRequest <Number>
                {
                    Entities  = numbers,
                    Recursive = true
                });
                foreach (var number in numbers)
                {
                    Console.WriteLine($"{number.Id};{number.Value}");
                }

                var nums = GenerateNumbers(50, 100, now)
                           .Select(n => new Num {
                    Val = n.Value
                })
                           .ToList();
                var existingNumbers = db.BulkSelect <Num, Number>(new BulkSelectRequest <Num>
                {
                    Items = nums,
                    KeyPropertyMappings = new[]
                    {
                        new KeyPropertyMapping
                        {
                            ItemPropertyName   = "Val",
                            EntityPropertyName = "Value"
                        },
                    }
                });

                //var expectedNumbers = numbers.Skip(49).Take(100).ToArray();
                //for (int i = 0; i < 100; i++)
                //{
                //    Assert.AreEqual(expectedNumbers[i].Id, existingNumbers[i].Id);
                //    Assert.AreEqual(expectedNumbers[i].ParityId, existingNumbers[i].ParityId);
                //    Assert.AreEqual(expectedNumbers[i].UpdatedAt.ToString(CultureInfo.InvariantCulture), existingNumbers[i].UpdatedAt.ToString(CultureInfo.InvariantCulture));
                //    Assert.AreEqual(expectedNumbers[i].UpdatedBy, existingNumbers[i].UpdatedBy);
                //    Assert.AreEqual(expectedNumbers[i].Value, existingNumbers[i].Value);
                //}
            }
        }
Пример #13
0
        public void EntitiesOfDifferentTypeMatchingExistingEntitiesShouldBeSelected()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                // Save 200 numbers (1 to 200) to the database.
                var numbers = GenerateNumbers(1, 200, now).ToArray();
                db.BulkInsertAll(new BulkInsertRequest <Number>
                {
                    Entities  = numbers,
                    Recursive = true
                });

                // Create a list of 100 numbers with values 151 to 250
                var nums = GenerateNumbers(151, 100, now)
                           .Select(n => new Num {
                    Val = n.Value
                })
                           .ToList();

                // Numbers 151 to 200 out of 151 to 250 should be selected.
                var existingNumbers = db.BulkSelectExisting <Num, Number>(new BulkSelectRequest <Num>
                {
                    Items = nums,
                    KeyPropertyMappings = new[]
                    {
                        new KeyPropertyMapping
                        {
                            ItemPropertyName   = "Val",
                            EntityPropertyName = "Value"
                        },
                    }
                }).ToArray();

                Assert.AreEqual(50, existingNumbers.Length);
                for (int i = 0; i < 50; i++)
                {
                    Assert.AreEqual(nums[i], existingNumbers[i]);
                }
            }
        }
Пример #14
0
        public void PrimaryKeyColumnMappedToPropertyWithDifferentNameShouldBeAllowed()
        {
            using (var db = new NumberContext())
            {
                var now = DateTime.Now;

                // The Parity table is defined with a pk column named Key but
                // it is mapped to the property Id. There was a user reporting that
                // this did not work properly so we want to test it.
                var parities = new[]
                {
                    new Parity {
                        Name = "Even", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                    new Parity {
                        Name = "Odd", UpdatedAt = now, UpdatedBy = "Måns"
                    },
                };
                db.BulkInsertAll(parities);

                Assert.IsTrue(parities[0].Id > 0);
                Assert.IsTrue(parities[1].Id > 0);
            }
        }