Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
... entity.HasMany(e=>e.Cars) .WithOne(c=>c.MakeNavigation) .HasForeignKey(c=>c.MakeId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_Inventory_Makes_MakeId"); });Отношения "один к одному"
Отношения "один к одному" конфигурируются аналогично, но только вместо метода
WithMany()WithOne()CarRadioRadiomodelBuilder.Entity<Radio>(entity =>{ entity.HasIndex(e => e.CarId, "IX_Radios_CarId") .IsUnique(); entity.HasOne(d => d.CarNavigation) .WithOne(p => p.RadioNavigation) .HasForeignKey<Radio>(d => d.CarId);});Даже если отношение определено в главной сущности, то к зависимой сущности все равно добавляется уникальный индекс. Далее приведен код установки отношения между сущностями
CarRadiomodelBuilder.Entity<Radio>(entity =>{ entity.HasIndex(e => e.CarId, "IX_Radios_CarId") .IsUnique();});modelBuilder.Entity<Car>(entity =>{ entity.HasOne(d => d.RadioNavigation) .WithOne(p => p.CarNavigation) .HasForeignKey<Radio>(d => d.CarId);});Отношения "многие ко многим"
Отношения "многие ко многим" гораздо легче настраивать посредством Fluent API. Имена полей внешних ключей, имена индексов и каскадное поведение могут быть установлены в операторах, определяющих отношение. Ниже показан пример отношения "многие ко многим", переделанный с применением Fluent API (имена ключей и столбцов были изменены, чтобы улучшить читабельность):
modelBuilder.Entity<Car>() .HasMany(p => p.Drivers) .WithMany(p => p.Cars) .UsingEntity<Dictionary<string, object>>( "CarDriver", j => j .HasOne<Driver>() .WithMany() .HasForeignKey("DriverId") .HasConstraintName("FK_CarDriver_Drivers_DriverId") .OnDelete(DeleteBehavior.Cascade), j => j .HasOne<Car>() .WithMany() .HasForeignKey("CarId") .HasConstraintName("FK_CarDriver_Cars_CarId") .OnDelete(DeleteBehavior.ClientCascade));Соглашения, аннотации данных и Fluent API — что выбрать?
В настоящий момент вас может интересовать, какой из вариантов следует выбирать для формирования ваших сущностей, а также их связей друг с другом и с хранилищем данных? Ответ: все три. Соглашения активны всегда (если только вы не переопределите их посредством аннотаций данных или Fluent API). С помощью аннотаций данных можно делать почти все то, на что способны методы Fluent API, и хранить информацию в самом сущностном классе, повышая в ряде случаев читабельность кода и удобство его сопровождения. Из трех вариантов наиболее мощным является Fluent API, но код скрыт в классе
DbContextВыполнение запросов
Запросы на извлечение данных создаются посредством запросов LINQ в отношении свойств
DbSet<T>foreachСкажем, чтобы извлечь из базы данных все записи об автомобилях желтого цвета, запустите следующий запрос:
var cars = Context.Cars.Where(x=>x.Color == "Yellow");Благодаря отложенному выполнению база данных фактически не запрашивается до тех пор, пока не начнется проход по результатам. Чтобы выполнить запрос немедленно, используйте
ToList()var cars = Context.Cars.Where(x=>x.Color == "Yellow").ToList();Поскольку запросы не выполняются до их запуска, их можно строить в нескольких строках кода. Показанный ниже пример кода делает то же самое, что и предыдущий пример:
Похожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.