Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

...

public IEnumerable<CarDriver> CarDrivers { get; set; }

}

public class CarDriver

{

public int CarId {get;set;}

public Car CarNavigation {get;set;}

public int DriverId {get;set;}

public Driver DriverNavigation {get;set;}

}

Добавьте

в класс
ApplicationDbContext
экземпляр
DbSet<Driver>
:

public virtual DbSet<Car> Cars { get; set; }

public virtual DbSet<Make> Makes { get; set; }

public virtual DbSet<Radio> Radios { get; set; }

public virtual DbSet<Driver> Drivers { get; set; }

Создайте миграцию и обновите базу данных с помощью следующих команд:

dotnet ef migrations add Many2Many -o Migrations

– c AutoLot.Samples.ApplicationDbContext

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

После обновления базы данных с применением миграции EF Core таблица

Cars
не изменяется, но создаются таблицы
Drivers
и
CarDriver
:

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

)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]

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) установлены правила, управляющие поведением при удалении строки. Если связанные (зависимые) записи тоже должны быть удалены, то такой подход называется каскадным удалением. В EF Core существуют три действия, которые могут произойти при удалении главной сущности (с зависимыми сущностями, загруженными в память):

• зависимые записи удаляются:

• зависимые внешние ключи устанавливаются в

null
;

• зависимые сущности остаются незатронутыми.

Стандартное поведение для необязательных и обязательных отношений отличается. Поведение можно установить в одно из семи значений, из которых рекомендуется использовать только пять. Поведение конфигурируется с применением перечисления

DeleteBehavior
посредством Fluent API. Ниже перечислены доступные варианты в перечислении:

Cascade
;

ClientCascade
;

ClientNoAction
(не рекомендуется к использованию);

Поделиться с друзьями: