Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 290 291 292 293 294 295 296 297 298 ... 407
Перейти на страницу:
class="code">public, унаследуйте его от BaseRepo<Make>, реализуйте IMakeRepo и добавьте два обязательных конструктора:

namespace AutoLot.Dal.Repos

{

  public class MakeRepo : BaseRepo<Make>, IMakeRepo

  {

    public MakeRepo(ApplicationDbContext context)

      : base(context)

     {

    }

    internal MakeRepo(

      DbContextOptions<ApplicationDbContext> options)

      : base(options)

    {

    }

  }

}

Переопределите методы GetAll(), чтобы они сортировали значения Make по названиям:

public override IEnumerable<Make> GetAll()

  => Table.OrderBy(m => m.Name);

public override IEnumerable<Make> GetAllIgnoreQueryFilters()

  => Table.IgnoreQueryFilters().OrderBy(m => m.Name);

Хранилище данных о заказах

Откройте файл класса OrderRepo.cs и поместите в его начало следующие операторы using:

using AutoLot.Dal.EfStructures;

using AutoLot.Dal.Models.Entities;

using AutoLot.Dal.Repos.Base;

using AutoLot.Dal.Repos.Interfaces;

using Microsoft.EntityFrameworkCore;

Измените класс на public, унаследуйте его от BaseRepo<Order> и реализуйте IOrderRepo:

namespace AutoLot.Dal.Repos

{

  public class OrderRepo : BaseRepo<Order>, IOrderRepo

  {

    public OrderRepo(ApplicationDbContext context)

      : base(context)

    {

    }

    internal OrderRepo(

      DbContextOptions<ApplicationDbContext> options)

      : base(options)

    {

    }

  }

}

Реализуйте метод GetOrderViewModel(), который возвращает экземпляр реализации IQueryable<CustomOrderViewModel> из представления базы данных:

public IQueryable<CustomerOrderViewModel> GetOrdersViewModel()

{

  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}.

      {tableName}", RESEED, 1);");

  }

}

На заметку! Метод ExecuteSqlRaw() фасадного экземпляра базы данных должен применяться осторожно, чтобы избежать потенциальных атак внедрением в SQL. Теперь, когда вы можете удалять и создавать базу данных и очищать данные, пора заняться методами, которые будут добавлять выборочные данные.

Инициализация базы данных

Вам предстоит построить свою систему заполнения начальными данными, которую можно запускать по требованию. Первым шагом будет создание выборочных данных и добавление в класс SampleDatalnitializer методов для загрузки выборочных данных в базу.

Создание выборочных данных

Добавьте в каталог Initialization новый файл по имени SampleData.cs. Сделайте его открытым и статическим и поместите в него следующие операторы using:

using System.Collections.Generic;

using AutoLot.Dal.Entities;

using AutoLot.Dal.Entities.Owned;

namespace AutoLot.Dal.Initialization

{

  public static class SampleData

  {

  }

}

Класс SampleData содержит пять статических методов, которые создают выборочные данные:

{

  new() {Id = 1, PersonalInformation = new() {FirstName = "Dave",

                                              LastName = "Brenner"}},

  new() {Id = 2, PersonalInformation = new() {FirstName = "Matt",

                                              LastName = "Walton"}},

  new() {Id = 3, PersonalInformation = new() {FirstName = "Steve",

                                              LastName = "Hagen"}},

  new() {Id = 4, PersonalInformation = new() {FirstName = "Pat",

                                              LastName = "Walton"}},

  new() {Id = 5, PersonalInformation = new() {FirstName = "Bad",

                                              LastName = "Customer"}},

1 ... 290 291 292 293 294 295 296 297 298 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?