(на основе соглашения, которое будет раскрыто вскоре),
Radio
является зависимой, а
Car
— главной сущностью. Исполняющая среда EF Core неявно создает обязательный уникальный индекс на свойстве внешнего ключа в зависимой сущности. Если вы хотите изменить имя индекса, тогда можете воспользоваться аннотациями данных или Fluent API.
Добавьте в класс
ApplicationDbContext
экземпляр
DbSet<Radio>
:
public virtual DbSet<Car> Cars { get; set; }
public virtual DbSet<Make> Makes { get; set; }
public virtual DbSet<Radio> Radios { get; set; }
Создайте миграцию и обновите базу данных с помощью таких команд:
dotnet ef migrations add One2One -o Migrations
– c AutoLot.Samples.ApplicationDbContext
dotnet ef database update One2One -c AutoLot.Samples.ApplicationDbContext
В результате обновления базы данных с применением миграции EF Core таблица
WITH CHECK ADD CONSTRAINT [FK_Radios_Cars_CarId] FOREIGN
KEY([CarId])
REFERENCES [dbo].[Cars] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Radios] CHECK CONSTRAINT [FK_Radios_Cars_CarId]
GO
Обратите
внимание на ограничения внешнего ключа и проверки, созданные для зависимой таблицы (
Radios
).
Отношения "многие ко многим" (нововведение в версии EF Core 5)
В отношении "многие ко многим" каждая сущность содержит навигационное свойство типа коллекции для другой сущности, что в хранилище данных реализуется с использованием таблицы соединения посреди двух сущностных таблиц. Такая таблица соединения именуется в соответствии с двумя таблицами в виде
<Сущность1Сущность2>
. Имя можно изменить в коде через Fluent API. Таблица соединения имеет отношения "один ко многим" с каждой сущностной таблицей:
namespace AutoLot.Samples.Models
{
public class Car : BaseEntity
{
public string Color { get; set; }
public string PetName { get; set; }
public int MakeId { get; set; }
public Make MakeNavigation { get; set; }
public Radio RadioNavigation { get; set; }
public IEnumerable<Driver> Drivers { get; set; } = new List<Driver>;
}
}
namespace AutoLot.Samples.Models
{
public class Driver : BaseEntity
{
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Car> Cars { get; set; } = new List<Car>;
}
}
Эквивалентное решение можно обеспечить путем явного создания трех таблиц и именно так приходилось поступать в версиях EF Core, предшествующих EF Core 5. Вот как выглядит сокращенный пример:
public class Driver
{
...
public IEnumerable<CarDriver> CarDrivers { get; set; }