Реализуйте метод GetOrderViewModel()
, который возвращает экземпляр реализации IQueryable
из представления базы данных:
public IQueryable
{
return Context.CustomerOrderViewModels!.AsQueryable();
}
На этом реализация всех классов хранилищ завершена. В следующем разделе будет написан код для удаления, создания и начального заполнения базы данных.
Программная работа с базой данных и миграциями
Свойство Database
класса DbContext
предлагает программные методы для удаления и создания базы данных, а также для запуска всех миграций. В табл. 23.1 описаны методы, соответствующие указанным операциям.
Как упоминалось в табл. 23.1, метод EnsureCreated()
создает базу данных, если она не существует, после чего создает таблицы, столбцы и индексы на основе сущностной модели. Никаких миграций он не применяет.
Если вы используете миграции, тогда при работе с базой данных будут возникать ошибки, и вам придется прибегнуть к уловке (как делалось ранее), чтобы заставить инфраструктуру EF Core "поверить" в то, что миграции были применены. Кроме того, вам нужно будет вручную применить к базе данных любые специальные объекты SQL. В случае работы с миграциями для программного создания базы данных всегда используйте метод Migrate()
, а не EnsureCreated()
.
Удаление, создание и очистка базы данных
Во время разработки нередко полезно удалять и воссоздавать рабочую базу данных и затем заполнять ее выборочными данными. В итоге получается среда, где тестирование (ручное или автоматизированное) может проводиться без опасения нарушить другие тесты из-за изменения данных. Создайте в проекте AutoLot.Dal
новый каталог по имени Initialization
и поместите в него новый файл класса SampleDatalnitializer.cs
. Вот как должны выглядеть операторы using
в начале файла:
using System;
using System.Collections.Generic;
using System.Linq;
using AutoLot.Dal.EfStructures;
using AutoLot.Models.Entities;
using AutoLot.Models.Entities.Base;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
Сделайте класс открытым и статическим:
namespace AutoLot.Dal.Initialization
{
public static class SampleDataInitializer
{
}
}
Создайте метод по имени DropAndCreateDatabase()
, который в качестве единственного параметра принимает экземпляр ApplicationDbContext
. Этот метод использует свойство Database
экземпляра ApplicationDbContext
, чтобы сначала удалить базу данных (с помощью метода EnsureDeleted()
) и затем создать ее заново (посредством метода Migrate()
):
public static void DropAndCreateDatabase(ApplicationDbContext context)
{
context.Database.EnsureDeleted();
context.Database.Migrate();
}
Создайте еще один метод по имени ClearData()
, который удаляет все данные из базы данных и сбрасывает значения идентичности для первичного ключа каждой таблицы. Метод проходит по списку сущностей предметной области и применяет свойство Model
класса DbContext
для получения схемы и имени таблицы, на которые отображается каждая сущность. Затем он выполняет оператор DELETE
и сбрасывает идентичность для каждой таблицы, используя метод ExecuteSqlRaw()
на свойстве Database
класса DbContext
:
internal static void ClearData(ApplicationDbContext context)
{
var entities = new[]
{
typeof(Order).FullName,
typeof(Customer).FullName,
typeof(Car).FullName,
typeof(Make).FullName,
typeof(CreditRisk).FullName
};
foreach (var entityName in entities)
{
var entity = context.Model.FindEntityType(entityName);
var tableName = entity.GetTableName();
var schemaName = entity.GetSchema();
context.Database.ExecuteSqlRaw($"DELETE FROM {schemaName}.{tableName}");
context.Database.ExecuteSqlRaw($"DBCC CHECKIDENT (\"{schemaName}.