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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 281 282 283 284 285 286 287 288 289 ... 407
Перейти на страницу:
Core не предусмотрено конструкций, напрямую отображаемых на хранимые процедуры, создать шаблон невозможно. С применением EF Core можно создавать хранимые процедуры и другие объекты SQL, но на этот раз шаблоны формируются только для таблиц и представлений.

Переключение на подход "сначала код"

Теперь, имея базу данных, для которой сформированы сущности, самое время переключиться с подхода "сначала база данных" на подход "сначала код". Для такого переключения должна быть создана фабрика контекстов, а также миграция из текущего состояния проекта. Затем либо база данных удаляется и воссоздается за счет применения миграции, либо задействуется фиктивная реализация для "обмана" инфраструктуры EF Core.

Создание фабрики экземпляров класса, производного от DbContext, на этапе проектирования

Как было указано в главе 22, инструменты командной строки EF Core используют реализацию IDesignTimeDbContextFactory для создания экземпляра класса, производного от DbContext. Создайте в каталоге EfStructures проекта AutoLot.Dal новый файл класса по имени ApplicationDbContextFactory.cs. Добавьте в файл класса следующие пространства имен:

using System;

using Microsoft.EntityFrameworkCore;

using Microsoft.EntityFrameworkCore.Design;

Детали фабрики раскрывались в предыдущей главе, а здесь представлен только код. Для информационных целей посредством дополнительного вызова Console.WriteLine() на консоль выводится строка подключения. Не забудьте привести строку подключения в соответствие со своей средой:

namespace AutoLot.Dal.EfStructures

{

   public class ApplicationDbContextFactory

     : IDesignTimeDbContextFactory<ApplicationDbContext>

  {

    public ApplicationDbContext CreateDbContext(string[] args)

    {

      var optionsBuilder =

        new DbContextOptionsBuilder<ApplicationDbContext>();

      var connectionString = @"server=.,5433;Database=AutoLot;

      User Id=sa;Password=P@ssw0rd;";

      optionsBuilder.UseSqlServer(connectionString);

      Console.WriteLine(connectionString);

      return new ApplicationDbContext(optionsBuilder.Options);

    }

  }

}

Создание начальной миграции

Вспомните, что первая миграция создаст три файла: два файла с частичным классом миграции и еще один с полным моментальным снимком модели. Введите в окне командной строки показанную далее команду, находясь в каталоге AutoLot.Dal, чтобы создать новую миграцию по имени Initial (используя экземпляр только что полученного класса ApplicationDbContext) и поместить файлы миграции в каталог EfStructuresMigrations проекта AutoLot.Dal:

dotnet ef migrations add Initial -o EfStructuresMigrations

 -c AutoLot.Dal.EfStructures.ApplicationDbContext

На заметку! Важно позаботиться о том, чтобы в сгенерированные файлы или базу данных не вносились изменения до тех пор, пока не будет создана и применена начальная миграция. Изменения на любой из сторон приведут к тому, что код и база данных утратят синхронизацию. После применения начальной миграции все изменения должны вноситься в базу данных через миграции EF Core.

Удостоверьтесь в том, что миграция была создана и ожидает применения, выполнив команду list:

dotnet ef migrations list -c AutoLot.Dal.EfStructures.ApplicationDbContext

Результат покажет, что миграция Initial ожидает обработки (ваша отметка времени будет другой). Строка подключения присутствует в выводе из-за вызова Console.Writeline() в методе CreateDbContext():

Build started...

Build succeeded.

server=.,5433;Database=AutoLot;User Id=sa;Password=P@ssw0rd;

20201231203939_Initial (Pending)

Применение миграции

Самый простой способ применения миграции к базе данных предусматривает ее удаление и повторное создание. Если вас он устраивает, тогда можете ввести приведенные ниже команды и перейти к чтению следующего раздела:

dotnet ef database drop -f

dotnet ef database update Initial -c AutoLot.Dal.EfStructures.ApplicationDbContext

Если вариант с удалением и повторным созданием базы данных не подходит (скажем, в случае базы данных Azure SQL), то инфраструктуре EF Core необходимо обеспечить уверенность о том, что миграция была применена. К счастью, с помощью EF Core выполнить всю работу легко. Начните с создания из миграции сценария SQL, используя следующую команду:

dotnet ef migrations script --idempotent -o FirstMigration.sql

Важными частями сценария являются те, которые создают таблицу __EFMigrationsHistory и затем добавляют в нее запись о миграции, указывающую на ее применение. Скопируйте эти части в новый запрос внутри Azure Data Studio или SQL Server Manager Studio. Вот необходимый код SQL (отметка времени у вас будет отличаться):

IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL

BEGIN

    CREATE TABLE [__EFMigrationsHistory] (

        [MigrationId] nvarchar(150) NOT NULL,

        [ProductVersion] nvarchar(32) NOT NULL,

        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])

    );

END;

GO

INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])

VALUES (N'20201231203939_Initial', N'5.0.1');

Если вы теперь запустите команду list, то она больше не будет отображать миграцию Initial как ожидающую обработки. После применения начальной миграции проект и база данных синхронизированы, а разработка будет продолжаться в стиле "сначала код".

Обновление модели

В этом разделе все текущие сущности обновляются до своих финальных версий, к тому же добавляется сущность регистрации в журнале. Обратите внимание, что ваши проекты не смогут быть скомпилированы вплоть до завершения данного раздела.

Сущности

В каталоге Entities проекта AutoLot.Models вы обнаружите пять файлов, по одному для каждой таблицы в базе данных. Несложно заметить, что имена имеют форму единственного, а не множественного числа (как в базе данных). Это особенность версии EF Core 5, где средство перевода имен в множественное число по умолчанию включено при создании шаблонов сущностей для базы данных.

Изменения, которые вы внесете в сущностные классы, включают добавление базового класса, создание принадлежащего сущностного класса Person, исправление имен навигационных свойств и добавление ряда дополнительных свойств. Кроме того, вы добавите новую сущность для регистрации в журнале (которая будет использоваться в главах, посвященных ASP.NET Core). В предыдущей главе подробно рассматривались соглашения EF Core, аннотации данных и Fluent API, так что в текущей главе будут приводиться в основном листинги кода с краткими описаниями.

Класс BaseEntity

Класс BaseEntity будет содержать столбцы Id и TimeStamp, присутствующие в каждой сущности. Создайте новый каталог по имени Base в каталоге Entities проекта AutoLot.Models. Поместите в этот каталог новый файл BaseEntity.cs со следующим кодом:

using System.ComponentModel.DataAnnotations;

using System.ComponentModel.DataAnnotations.Schema;

namespace AutoLot.Models.Entities.Base

{

  public abstract class BaseEntity

  {

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    public int Id { get; set; }

    [TimeStamp]

    public byte[]? TimeStamp { get; set; }

  }

}

1 ... 281 282 283 284 285 286 287 288 289 ... 407
Перейти на страницу:

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