Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 412
- Предыдущая
- 412/642
- Следующая
dotnet ef migrations add TPH -o Migrations -c AutoLot.Samples.ApplicationDbContextdotnet ef database update TPH -c AutoLot.Samples.ApplicationDbContextПервая команда устанавливает инструменты командной строки EF Core как глобальные. На вашей машине это понадобится сделать только раз. Вторая команда создает в папке
MigrationsApplicationDbContextAutoLot.SamplesКогда EF Core используется для создания этой таблицы в базе данных, то унаследованный класс
BaseEntityCarCREATE 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 (раскрываемые вскоре).
Сопоставление "таблица на тип" (ТРТ)
Для изучения схемы сопоставления ТРТ можно использовать те же самые сущности, что и ранее, даже если базовый класс помечен как абстрактный. Поскольку схема TPH применяется по умолчанию, инфраструктуру EF Core необходимо проинструктировать для отображения каждого класса на таблицу, что можно сделать с помощью аннотаций данных или Fluent API. Добавьте в
ApplicationDbContextprotected override void OnModelCreating(ModelBuilder modelBuilder){<b> modelBuilder.Entity<BaseEntity>().ToTable("BaseEntities");</b><b> modelBuilder.Entity<Car>().ToTable("Cars");</b> OnModelCreatingPartial(modelBuilder);}partial void OnModelCreatingPartial(ModelBuilder modelBuilder);Чтобы "сбросить" базу данных и проект, удалите папку
Migrationsdotnet ef database drop -f -c AutoLot.Samples.ApplicationDbContextТеперь создайте и примените миграцию для схемы ТРТ:
dotnet ef migrations add TPT -o Migrations -c AutoLot.Samples.ApplicationDbContextdotnet ef database update TPT -c AutoLot.Samples.ApplicationDbContextПри обновлении базы данных исполняющая среда EF Core создаст следующие таблицы. Индексы также показывают, что таблицы имеют сопоставление "один к одному":
CREATE TABLE [dbo].[BaseEntities]( [Id] [int] IDENTITY(1,1) NOT NULL, [TimeStamp] [varbinary](max) NULL, CONSTRAINT [PK_BaseEntities] 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]GOCREATE TABLE [dbo].[Inventory]( [Id] [int] NOT NULL, [MakeId] [int] NOT NULL, [Color] [nvarchar](max) NULL, [PetName] [nvarchar](max) NULL, CONSTRAINT [PK_Inventory] 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]GOALTER TABLE [dbo].[Inventory]WITH CHECK ADD CONSTRAINT [FK_Inventory_BaseEntities_Id] FOREIGN KEY([Id])REFERENCES [dbo].[BaseEntities] ([Id])GOALTER TABLE [dbo].[Inventory] CHECK CONSTRAINT [FK_Inventory_BaseEntities_Id]GOНа заметку! С сопоставлением TPT связаны значительные последствия в плане производительности, которые должны приниматься во внимание при выборе данной схемы сопоставления. Дополнительные сведения ищите в документации:
https://docs.microsoft.com/ru-ru/ef/core/performance/modeling-for-performance#inheritance-mappingЧтобы "сбросить" базу данных и проект для подготовки к следующему набору примеров, закомментируйте код в методе
OnModelCreating()Migrations- Предыдущая
- 412/642
- Следующая
