CREATE TABLE [dbo].[Drivers](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[FirstName] [NVARCHAR](MAX) NULL,
[LastName] [NVARCHAR](MAX) NULL,
[TimeStamp] [VARBINARY](MAX) NULL,
CONSTRAINT [PK_Drivers] 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]
GO
CREATE TABLE [dbo].[CarDriver](
[CarsId] [int] NOT NULL,
[DriversId] [int] NOT NULL,
CONSTRAINT [PK_CarDriver] PRIMARY KEY CLUSTERED
(
[CarsId] ASC,
[DriversId] ASC
)
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[CarDriver]
WITH CHECK ADD CONSTRAINT [FK_CarDriver_Cars_CarsId] FOREIGN
KEY([CarsId])
REFERENCES [dbo].[Cars] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[CarDriver] CHECK CONSTRAINT [FK_CarDriver_Cars_CarsId]
GO
ALTER TABLE [dbo].[CarDriver]
WITH CHECK ADD CONSTRAINT [FK_CarDriver_Drivers_DriversId]
FOREIGN KEY([DriversId])
REFERENCES [dbo].[Drivers] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[CarDriver] CHECK CONSTRAINT [FK_CarDriver_Drivers_DriversId]
GO
Обратите внимание на то, что исполняющая среда EF Core создает составной первичный ключ, ограничения проверки (внешних ключей) и каскадное поведение, чтобы обеспечить конфигурирование таблицы CarDriver
На заметку!
На момент написания главы создание шаблонов для отношений "многие ко многим" пока не поддерживалось. Создание шаблонов для отношений "многие ко многим" основано на табличной структуре, как во втором примере с сущностьюCarDriver. Дополнительные сведения о проблеме доступны по ссылке https://github.com/dotnet/efcore/issues/22475.Каскадное поведение
В большинстве хранилищ данных (вроде SQL Server) установлены правила, управляющие поведением при удалении строки. Если связанные (зависимые) записи тоже должны быть удалены, то такой подход называется
• зависимые записи удаляются:
• зависимые внешние ключи устанавливаются в null
• зависимые сущности остаются незатронутыми.
Стандартное поведение для необязательных и обязательных отношений отличается. Поведение можно установить в одно из семи значений, из которых рекомендуется использовать только пять. Поведение конфигурируется с применением перечисления DeleteBehavior
• Cascade
• ClientCascade
• ClientNoAction
• ClientSetNull
• NoAction
• SetNull
• Restrict
Указанное поведение в EF Core инициируется только после удаления сущности и вызова метода SaveChanges
DbContext. Дополнительные сведения о том, когда EF Core взаимодействует с хранилищем данных, ищите в разделе "Выполнение запросов" далее в главе.Необязательные отношения
Вспомните из табл. 22.4, что необязательными отношениями считаются такие, в которых зависимая сущность
null. Для необязательных отношений стандартным поведением является ClientSetNull. В табл. 22.5 описано каскадное поведение с зависимыми сущностями и влияние на записи базы данных при использовании SQL Server.Обязательные отношения
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT