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")); } } }
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); } }
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]); } } }
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")); } } }
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); } }
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); } }
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); } }
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]); } } }
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); //} } }
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]); } } }
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); } }