Язык программирования C#9 и платформа .NET5
Часть 452 из 642 Информация о книге
new() {Id = 6, MakeId = 5, Color = "Green", PetName = "Hank"},new() {Id = 7, MakeId = 5, Color = "Pink", PetName = "Pinky"},new() {Id = 8, MakeId = 6, Color = "Black", PetName = "Pete"},new() {Id = 9, MakeId = 4, Color = "Brown", PetName = "Brownie"},new() {Id = 10, MakeId = 1, Color = "Rust", PetName = "Lemon",IsDrivable = false},};public static List<Order> Orders => new(){new() {Id = 1, CustomerId = 1, CarId = 5},new() {Id = 2, CustomerId = 2, CarId = 1},new() {Id = 3, CustomerId = 3, CarId = 4},new() {Id = 4, CustomerId = 4, CarId = 7},new() {Id = 5, CustomerId = 5, CarId = 10},};public static List<CreditRisk> CreditRisks => new(){new(){Id = 1,CustomerId = Customers[4].Id,PersonalInformation = new(){FirstName = Customers[4].PersonalInformation.FirstName,LastName = Customers[4].PersonalInformation.LastName}}};Загрузка выборочных данных
Внутренний метод
в классеSeedData()добавляет данные из методов классаSampleDatalnitializerк экземпляруSampleDataи сохраняет данные в базе данных:ApplicationDbContextinternal static void SeedData(ApplicationDbContext context){try{ProcessInsert(context, context.Customers!, SampleData.Customers);ProcessInsert(context, context.Makes!, SampleData.Makes);ProcessInsert(context, context.Cars!, SampleData.Inventory);ProcessInsert(context, context.Orders!, SampleData.Orders);ProcessInsert(context, context.CreditRisks!, SampleData.CreditRisks);}catch (Exception ex){Console.WriteLine(ex);// Поместить сюда точку останова, чтобы выяснить,// в чем заключается проблема.throw;}static void ProcessInsert<TEntity>(ApplicationDbContext context,DbSet<TEntity> table,List<TEntity> records) where TEntity : BaseEntity{if (table.Any()){return;}IExecutionStrategy strategy = context.Database.CreateExecutionStrategy();strategy.Execute(() =>{using var transaction = context.Database.BeginTransaction();try{var metaData = context.Model.FindEntityType(typeof(TEntity).FullName);context.Database.ExecuteSqlRaw($"SET IDENTITY_INSERT {metaData.GetSchema()}.{metaData.GetTableName()} ON");table.AddRange(records);context.SaveChanges();context.Database.ExecuteSqlRaw($"SET IDENTITY_INSERT {metaData.GetSchema()}.{metaData.GetTableName()} OFF");transaction.Commit();}catch (Exception){transaction.Rollback();}});}}Для обработки данных в методе
используется локальная функция. Сначала она проверяет, содержит ли таблица какие-то записи, и если нет, то переходит к обработке выборочных данных. Из фасадного экземпляра базы данных создается экземпляр реализацииSeedData(), применяемый для создания явной транзакции, которая необходима для включения и отключения вставки идентичности. Записи добавляются; если все прошло успешно, тогда транзакция фиксируется, а в противном случае подвергается откату.IExecutionStrategyПриведенные далее два открытых метода используются для сброса базы данных. Метод
удаляет и воссоздает базу данных перед ее заполнением начальными данными, а методInitializeData()просто удаляет все записи, сбрасывает идентичность и заполняет базу начальными данными:ClearDatabase()