private void RunInsert(bool isBulkOperation, bool insertTo2Tables = false) { using (var context = new TestContext(ContextUtil.GetOptions())) { var entities = new List <Item>(); var subEntities = new List <ItemHistory>(); for (int i = 1; i < entitiesNumber; i++) { entities.Add(new Item { ItemId = isBulkOperation ? i : 0, Name = "name " + i, Description = "info " + Guid.NewGuid().ToString().Substring(0, 3), Quantity = i % 10, Price = i / (i % 5 + 1), TimeUpdated = DateTime.Now }); } if (insertTo2Tables) { foreach (var entity in entities) { subEntities.Add(new ItemHistory { ItemHistoryId = SeqGuid.Create(), ItemId = entity.ItemId, Remark = "some more info" }); } } if (isBulkOperation) { if (!insertTo2Tables) { context.BulkInsert(entities); } else { using (var transaction = context.Database.BeginTransaction()) { context.BulkInsert( entities, new BulkConfig { PreserveInsertOrder = true, SetOutputIdentity = true, BatchSize = 4000 , UseTempDB = true }, (a) => WriteProgress(a) ); context.BulkInsert(subEntities); transaction.Commit(); } } } else { context.Items.AddRange(entities); if (insertTo2Tables) { context.ItemHistories.AddRange(subEntities); } context.SaveChanges(); } } using (var context = new TestContext(ContextUtil.GetOptions())) { int entitiesCount = context.Items.Count(); Item lastEntity = context.Items.LastOrDefault(); Assert.Equal(entitiesNumber - 1, entitiesCount); Assert.NotNull(lastEntity); Assert.Equal("name " + (entitiesNumber - 1), lastEntity.Name); } }
private void RunInsert(bool isBulkOperation) { using (var context = new TestContext(ContextUtil.GetOptions())) { var entities = new List <Item>(); var subEntities = new List <ItemHistory>(); for (int i = 1, j = -(EntitiesNumber - 1); i < EntitiesNumber; i++, j++) { var entity = new Item { ItemId = 0, //isBulkOperation ? j : 0, // no loger used since order(Identity temporary filled with negative values from -N to -1) is set automaticaly when PreserveInsertOrder=TRUE Name = "name " + i, Description = "info " + Guid.NewGuid().ToString().Substring(0, 3), Quantity = i % 10, Price = i / (i % 5 + 1), TimeUpdated = DateTime.Now, ItemHistories = new List <ItemHistory>() }; var subEntity1 = new ItemHistory { ItemHistoryId = SeqGuid.Create(), Remark = $"some more info {i}.1" }; var subEntity2 = new ItemHistory { ItemHistoryId = SeqGuid.Create(), Remark = $"some more info {i}.2" }; entity.ItemHistories.Add(subEntity1); entity.ItemHistories.Add(subEntity2); entities.Add(entity); } if (isBulkOperation) { if (ContextUtil.DbServer == DbServer.SqlServer) { using (var transaction = context.Database.BeginTransaction()) { var bulkConfig = new BulkConfig { PreserveInsertOrder = true, SetOutputIdentity = true, BatchSize = 4000, UseTempDB = true, CalculateStats = true }; context.BulkInsert(entities, bulkConfig, (a) => WriteProgress(a)); Assert.Equal(EntitiesNumber - 1, bulkConfig.StatsInfo.StatsNumberInserted); Assert.Equal(0, bulkConfig.StatsInfo.StatsNumberUpdated); Assert.Equal(0, bulkConfig.StatsInfo.StatsNumberDeleted); foreach (var entity in entities) { foreach (var subEntity in entity.ItemHistories) { subEntity.ItemId = entity.ItemId; // setting FK to match its linked PK that was generated in DB } subEntities.AddRange(entity.ItemHistories); } context.BulkInsert(subEntities); transaction.Commit(); } } else if (ContextUtil.DbServer == DbServer.Sqlite) { using (var transaction = context.Database.BeginTransaction()) { var bulkConfig = new BulkConfig() { SetOutputIdentity = true, }; context.BulkInsert(entities, bulkConfig); foreach (var entity in entities) { foreach (var subEntity in entity.ItemHistories) { subEntity.ItemId = entity.ItemId; // setting FK to match its linked PK that was generated in DB } subEntities.AddRange(entity.ItemHistories); } bulkConfig.SetOutputIdentity = false; context.BulkInsert(subEntities, bulkConfig); transaction.Commit(); } } } else { context.Items.AddRange(entities); context.SaveChanges(); } } using (var context = new TestContext(ContextUtil.GetOptions())) { var temp = context.ItemHistories.FirstOrDefault(); int entitiesCount = ItemsCountQuery(context); //Item lastEntity = LastItemQuery(context); Item lastEntity = context.Items.OrderByDescending(a => a.ItemId).FirstOrDefault(); Assert.Equal(EntitiesNumber - 1, entitiesCount); Assert.NotNull(lastEntity); Assert.Equal("name " + (EntitiesNumber - 1), lastEntity.Name); } }