Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
<< На главную

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Читать онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 416 417 418 419 420 421 422 423 424 ... 642
Перейти на страницу:

  ...

  entity.HasMany(e=&gt;e.Cars)

    .WithOne(c=&gt;c.MakeNavigation)

    .HasForeignKey(c=&gt;c.MakeId)

    .OnDelete(DeleteBehavior.ClientSetNull)

    .HasConstraintName(&quot;FK_Inventory_Makes_MakeId&quot;);

 });

Отношения "один к одному"

Отношения "один к одному" конфигурируются аналогично, но только вместо метода WithMany() интерфейса Fluent API используется метод WithOne(). К зависимой сущности добавляется уникальный индекс. Вот код для отношения между сущностями Car и Radio, где применяется зависимая сущность (Radio):

modelBuilder.Entity&lt;Radio&gt;(entity =&gt;

{

  entity.HasIndex(e =&gt; e.CarId, &quot;IX_Radios_CarId&quot;)

    .IsUnique();

  entity.HasOne(d =&gt; d.CarNavigation)

    .WithOne(p =&gt; p.RadioNavigation)

    .HasForeignKey&lt;Radio&gt;(d =&gt; d.CarId);

});

Даже если отношение определено в главной сущности, то к зависимой сущности все равно добавляется уникальный индекс. Далее приведен код установки отношения между сущностями Car и Radio, где для отношения используется главная сущность:

modelBuilder.Entity&lt;Radio&gt;(entity =&gt;

{

  entity.HasIndex(e =&gt; e.CarId, &quot;IX_Radios_CarId&quot;)

    .IsUnique();

});

modelBuilder.Entity&lt;Car&gt;(entity =&gt;

{

  entity.HasOne(d =&gt; d.RadioNavigation)

    .WithOne(p =&gt; p.CarNavigation)

    .HasForeignKey&lt;Radio&gt;(d =&gt; d.CarId);

});

Отношения "многие ко многим"

Отношения "многие ко многим" гораздо легче настраивать посредством Fluent API. Имена полей внешних ключей, имена индексов и каскадное поведение могут быть установлены в операторах, определяющих отношение. Ниже показан пример отношения "многие ко многим", переделанный с применением Fluent API (имена ключей и столбцов были изменены, чтобы улучшить читабельность):

modelBuilder.Entity&lt;Car&gt;()

  .HasMany(p =&gt; p.Drivers)

  .WithMany(p =&gt; p.Cars)

  .UsingEntity&lt;Dictionary&lt;string, object&gt;&gt;(

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

    &quot;CarDriver&quot;,

    j =&gt; j

  .HasOne&lt;Driver&gt;()

      .WithMany()

      .HasForeignKey(&quot;DriverId&quot;)

      .HasConstraintName(&quot;FK_CarDriver_Drivers_DriverId&quot;)

      .OnDelete(DeleteBehavior.Cascade),

    j =&gt; j

      .HasOne&lt;Car&gt;()

      .WithMany()

      .HasForeignKey(&quot;CarId&quot;)

      .HasConstraintName(&quot;FK_CarDriver_Cars_CarId&quot;)

      .OnDelete(DeleteBehavior.ClientCascade));

Соглашения, аннотации данных и Fluent API — что выбрать?

В настоящий момент вас может интересовать, какой из вариантов следует выбирать для формирования ваших сущностей, а также их связей друг с другом и с хранилищем данных? Ответ: все три. Соглашения активны всегда (если только вы не переопределите их посредством аннотаций данных или Fluent API). С помощью аннотаций данных можно делать почти все то, на что способны методы Fluent API, и хранить информацию в самом сущностном классе, повышая в ряде случаев читабельность кода и удобство его сопровождения. Из трех вариантов наиболее мощным является Fluent API, но код скрыт в классе DbContext. Независимо от того, используете вы аннотации данных или Fluent API, имейте в виду, что аннотации данных переопределяют встроенные соглашения, а методы Fluent API переопределяют вообще все.

Выполнение запросов

Запросы на извлечение данных создаются посредством запросов LINQ в отношении свойств DbSet&lt;T&gt;. На стороне сервера механизм трансляции LINQ поставщика баз данных видоизменяет запрос LINQ с учетом специфичного для базы данных языка (скажем, Т-SQL). Запросы LINQ, охватывающие (или потенциально охватывающие) множество записей, не выполняются до тех пор, пока не начнется проход по результатам запросов (например, с применением foreach) или не произойдет привязка к элементу управления для их отображения (наподобие визуальной сетки данных). Такое отложенное выполнение позволяет строить запросы в коде, не испытывая проблем с производительностью из-за частого взаимодействия с базой данных.

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

var cars = Context.Cars.Where(x=&gt;x.Color == &quot;Yellow&quot;);

Благодаря отложенному выполнению база данных фактически не запрашивается до тех пор, пока не начнется проход по результатам. Чтобы выполнить запрос немедленно, используйте ToList():

var cars = Context.Cars.Where(x=&gt;x.Color == &quot;Yellow&quot;).ToList();

Поскольку запросы не выполняются до их запуска, их можно строить в нескольких строках кода. Показанный ниже пример кода делает то же самое, что и предыдущий пример:

1 ... 416 417 418 419 420 421 422 423 424 ... 642
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга