using System.Collections.Generic;

namespace AutoLot.Samples.Models

{

  public class Car : BaseEntity

  {

    public string Color { get; set; }

    public string PetName { get; set; }

    public int MakeId { get; set; }

  }

}

Чтобы уведомить EF Core о том, что сущностный класс является частью объектной модели, предусмотрите свойство DbSet для сущности. Добавьте в класс ApplicationDbContext такой оператор using:

using AutoLot.Samples.Models;

Поместите следующий код в класс ApplicationDbContext между конструктором и методом OnModelCreating():

public DbSet Cars { get; set; }

Обратите внимание, что базовый класс не добавляется в виде экземпляра DbSet. Хотя подробные сведения о миграциях приводятся позже в главе, давайте создадим базу данных и таблицу Cars. Откройте окно командной строки в папке проекта AutoLot.Samples и выполните показанные ниже команды:

dotnet tool install --global dotnet-ef --version 5.0.1

dotnet ef migrations add TPH -o Migrations

  -c AutoLot.Samples.ApplicationDbContext

dotnet ef database update TPH  -c AutoLot.Samples.ApplicationDbContext

Первая команда устанавливает инструменты командной строки EF Core как глобальные. На вашей машине это понадобится сделать только раз. Вторая команда создает в папке Migrations миграцию по имени ТРН с применением класса ApplicationDbContext в пространстве имен AutoLot.Samples. Третья команда обновляет базу на основе миграции ТРН.

Когда EF Core используется для создания этой таблицы в базе данных, то унаследованный класс BaseEntity объединяется с классом Car и создается единственная таблица:

CREATE TABLE [dbo].[Cars](

  [Id] [int] IDENTITY(1,1) NOT NULL,

  [MakeId] [int] NOT NULL,

  [Color] [nvarchar](max) NULL,

  [PetName] [nvarchar](max) NULL,

  [TimeStamp] [varbinary](max) NULL,

 CONSTRAINT [PK_Cars] PRIMARY KEY CLUSTERED

(

  [Id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,

 IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,

 ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

В предыдущем примере для создания свойств таблицы и столбцов применялись соглашения EF Core (раскрываемые вскоре).

<p id="AutBody_Root899"><strong>Сопоставление "таблица на тип" (ТРТ)</strong></p>

Для изучения схемы сопоставления ТРТ можно использовать те же самые сущности, что и ранее, даже если базовый класс помечен как абстрактный. Поскольку схема TPH применяется по умолчанию, инфраструктуру EF Core необходимо проинструктировать для отображения каждого класса на таблицу, что можно сделать с помощью аннотаций данных или Fluent API. Добавьте в ApplicationDbContext следующий код:

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

  modelBuilder.Entity().ToTable("BaseEntities");

  modelBuilder.Entity().ToTable("Cars");

  OnModelCreatingPartial(modelBuilder);

}

partial void OnModelCreatingPartial(ModelBuilder modelBuilder);

Чтобы "сбросить" базу данных и проект, удалите папку Migrations и базу данных. Вот как удалить базу данных в CLI:

dotnet ef database drop -f -c AutoLot.Samples.ApplicationDbContext

Теперь создайте и примените миграцию для схемы ТРТ:

dotnet ef migrations add TPT -o Migrations -c AutoLot.Samples.ApplicationDbContext

dotnet ef database update TPT  -c AutoLot.Samples.ApplicationDbContext

При обновлении базы данных исполняющая среда EF Core создаст следующие таблицы. Индексы также показывают, что таблицы имеют сопоставление "один к одному":

CREATE TABLE [dbo].[BaseEntities](

  [Id] [int] IDENTITY(1,1) NOT NULL,

Перейти на страницу:

Похожие книги