Язык программирования C#9 и платформа .NET5
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOCREATE TABLE [dbo].[Cars]([Id] [int] IDENTITY(1,1) NOT NULL,[Color] [nvarchar](max) NULL,[PetName] [nvarchar](max) NULL,[TimeStamp] [varbinary](max) NULL,<b> [MakeId] [int] NOT NULL,</b>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]GO<b>ALTER TABLE [dbo].[Cars]</b><b>WITH CHECK ADD CONSTRAINT [FK_Cars_Makes_MakeId] FOREIGN </b><b>KEY([MakeId])</b><b>REFERENCES [dbo].[Makes] ([Id])</b><b>ON DELETE CASCADE</b>GO<b>ALTER TABLE [dbo].[Cars] CHECK CONSTRAINT [FK_Cars_Makes_MakeId]</b>GOОбратите внимание на ограничения внешнего ключа и проверки, созданные для зависимой таблицы (
).CarsОтношения "один к одному"
В отношениях "один к одному" обе сущности имеют навигационные свойства типа ссылок друг на друга. Хотя отношения "один к одному" четко обозначают главную и зависимую сущности, при построении таких отношений EF Core необходимо сообщить о том, какая сторона является главной, либо явно определяя внешний ключ, либо указывая главную сущность с использованием Fluent API. Если не проинформировать исполняющую среду EF Core, тогда она будет делать выбор на основе своей способности обнаруживать внешний ключ. На практике вы должны четко определять зависимую сущность, добавляя свойства внешнего ключа:
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; }<b> public Radio RadioNavigation { get; set; }</b>}}namespace AutoLot.Samples.Models{public class Radio : BaseEntity{public bool HasTweeters { get; set; }public bool HasSubWoofers { get; set; }public string RadioId { get; set; }<b> public int CarId { get; set; }</b><b> public Car CarNavigation { get; set; }</b>}}Поскольку класс
имеет внешний ключ к классуRadio(на основе соглашения, которое будет раскрыто вскоре),Carявляется зависимой, аRadio— главной сущностью. Исполняющая среда EF Core неявно создает обязательный уникальный индекс на свойстве внешнего ключа в зависимой сущности. Если вы хотите изменить имя индекса, тогда можете воспользоваться аннотациями данных или Fluent API.CarДобавьте в класс
экземпляр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.ApplicationDbContextdotnet ef database update One2One -c AutoLot.Samples.ApplicationDbContextВ результате обновления базы данных с применением миграции EF Core таблица
не изменяется, но создается таблицаCars:RadiosCREATE TABLE [dbo].[Radios]([Id] [int] IDENTITY(1,1) NOT NULL,[HasTweeters] [bit] NOT NULL,[HasSubWoofers] [bit] NOT NULL,[RadioId] [nvarchar](max) NULL,[TimeStamp] [varbinary](max) NULL,<b> [CarId] [int] NOT NULL,</b>CONSTRAINT [PK_Radios] 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<b>ALTER TABLE [dbo].[Radios]</b><b>WITH CHECK ADD CONSTRAINT [FK_Radios_Cars_CarId] FOREIGN </b>