Язык программирования C#9 и платформа .NET5
Результат покажет, что миграция
ожидает обработки (ваша отметка времени будет другой). Строка подключения присутствует в выводе из-за вызова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 -fdotnet ef database update Initial -c AutoLot.Dal.EfStructures.ApplicationDbContextЕсли вариант с удалением и повторным созданием базы данных не подходит (скажем, в случае базы данных Azure SQL), то инфраструктуре EF Core необходимо обеспечить уверенность о том, что миграция была применена. К счастью, с помощью EF Core выполнить всю работу легко. Начните с создания из миграции сценария SQL, используя следующую команду:
dotnet ef migrations script --idempotent -o FirstMigration.sqlВажными частями сценария являются те, которые создают таблицу
и затем добавляют в нее запись о миграции, указывающую на ее применение. Скопируйте эти части в новый запрос внутри Azure Data Studio или SQL Server Manager Studio. Вот необходимый код SQL (отметка времени у вас будет отличаться):__EFMigrationsHistoryIF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULLBEGINCREATE TABLE [__EFMigrationsHistory] ([MigrationId] nvarchar(150) NOT NULL,[ProductVersion] nvarchar(32) NOT NULL,CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId]));END;GOINSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])VALUES (N'20201231203939_Initial', N'5.0.1');Если вы теперь запустите команду
, то она больше не будет отображать миграциюlistкак ожидающую обработки. После применения начальной миграции проект и база данных синхронизированы, а разработка будет продолжаться в стиле "сначала код".InitialОбновление модели
В этом разделе все текущие сущности обновляются до своих финальных версий, к тому же добавляется сущность регистрации в журнале. Обратите внимание, что ваши проекты не смогут быть скомпилированы вплоть до завершения данного раздела.
Сущности
В каталоге
проектаEntitiesвы обнаружите пять файлов, по одному для каждой таблицы в базе данных. Несложно заметить, что имена имеют форму единственного, а не множественного числа (как в базе данных). Это особенность версии EF Core 5, где средство перевода имен в множественное число по умолчанию включено при создании шаблонов сущностей для базы данных.AutoLot.ModelsИзменения, которые вы внесете в сущностные классы, включают добавление базового класса, создание принадлежащего сущностного класса
, исправление имен навигационных свойств и добавление ряда дополнительных свойств. Кроме того, вы добавите новую сущность для регистрации в журнале (которая будет использоваться в главах, посвященных ASP.NET Core). В предыдущей главе подробно рассматривались соглашения EF Core, аннотации данных и Fluent API, так что в текущей главе будут приводиться в основном листинги кода с краткими описаниями.PersonКласс BaseEntity
Класс
будет содержать столбцыBaseEntityиId, присутствующие в каждой сущности. Создайте новый каталог по имениTimeStampв каталогеBaseпроектаEntities. Поместите в этот каталог новый файлAutoLot.Modelsсо следующим кодом:BaseEntity.csusing 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; }}}Все сущности, шаблоны которых созданы из базы данных
, будут обновлены для применения базового классаAutoLot.BaseEntityПринадлежащий сущностный класс Person
Сущности
иCustomerимеют свойстваCreditRiskиFirstName. Если в каждой сущности присутствуют одни и те же свойства, тогда можно извлечь выгоду от перемещения этих свойств в принадлежащие классы. Пример с двумя свойствами тривиален, но принадлежащие сущностные классы помогают сократить дублирование кода и повысить согласованность. В дополнение к двум свойствам внутри классов определяется еще одно свойство, отображаемое на вычисляемый столбец SQL Server.LastNameСоздайте в каталоге
проектаEntitiesновый каталог по имениAutoLot.Modelsи добавьте в него новый файлOwned, содержимое которого показано ниже:Person.csusing System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;