Внутренний метод SeedData()
в классе SampleDatalnitializer
добавляет данные из методов класса SampleData
к экземпляру ApplicationDbContext
и сохраняет данные в базе данных:
internal 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
ApplicationDbContext context,
DbSet
List
{
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()
просто удаляет все записи, сбрасывает идентичность и заполняет базу начальными данными:
public static void InitializeData(ApplicationDbContext context)
{
DropAndCreateDatabase(context);
SeedData(context);
}
public static void ClearAndReseedDatabase(ApplicationDbContext context)
{
ClearData(context);
SeedData(context);
}
Настройка тестов
Вместо создания клиентского приложения для испытания скомпилированного уровня доступа к данным AutoLot
будет применяться автоматизированное интеграционное тестирование. Тесты продемонстрируют обращение к базе данных на предмет создания, чтения, обновления и удаления, что позволит исследовать код без накладных расходов по построению еще одного приложения. Каждый тест, рассматриваемый в этом разделе, будет выполнять запрос (создание, чтение, обновление или удаление) и иметь один и более операторов Assert
для проверки, получен ли ожидаемый результат.
Создание проекта
Первым делом необходимо настроить платформу интеграционного тестирования с использованием xUnit — инфраструктуры тестирования, совместимой с .NET Core. Начните с добавления нового по имени AutoLot.Dal.Tests
, который в Visual Studio носит название xUnit Test Project (.NET Core) (Проект тестирования xUnit (.NET Core)).