books-read.com
books-read.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

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

Наш ресурс дает возможность бесплатно читать книгу онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных . Сайт books-read.com дает возможность читать полную версию книги без регистрации и sms. Все книги онлайн, не надо качать fb2, epub, txt.
Добавить книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю в приложение ЧИТАТЬ КНИГУ ОФЛАЙН в приложении ios/android
Перейти на страницу:

// ApplicationDbContext

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

  modelBuilder.Entity<Car>(entity =>

  {

  ...

<b>  entity.Property(e =&gt; e.IsDrivable).HasDefaultValue(true);</b>

});

В случае если вы сохраните новую запись с

IsDrivable = false
, то значение
false
  игнорируется (т.к. оно является стандартным значением для булевского типа) и будет применяться стандартное значение. Таким образом, значение для
IsDrivable
всегда будет равно
true
! Одно из решений предусматривает превращение вашего открытого свойства (и, следовательно, столбца) в допускающее
null
, но это может не соответствовать бизнес-потребностям.

Другое решение предлагается инфраструктурой EF Core, в частности, ее работой с поддерживающими полями. Вспомните, что если поддерживающее поле существует (и идентифицируется как таковое для свойства через соглашение, аннотацию данных или Fluent API), тогда для действий по чтению и записи EF Core будет использовать поддерживающее поле, а не открытое свойство.

Если вы модифицируете

IsDrivable
с целью применения поддерживающего поля, допускающего
null
(но оставите свойство не допускающим
null
), то EF Core будет выполнять чтение и запись, используя поддерживающее поле, а не свойство. Стандартным значением для булевского типа, допускающего
null
, является
null
— не
false
. Описанное изменение обеспечит ожидаемое поведение свойства:

public class Car

{

  ...

  private bool? _isDrivable;

  public bool IsDrivable

  {

    get =&gt; _isDrivable ?? true;

    set =&gt; _isDrivable = value;

  }

Для информирования EF Core о поддерживающем поле используется Fluent API:

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

{

  entity.Property(p =&gt; p.IsDrivable)

<b>    .HasField(&quot;_isDrivable&quot;)</b>

    .HasDefaultValue(true);

});

На заметку! В приведенном примере вызов метода

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

Исполняющая среда EF Core транслирует поле в показанное ниже определение SQL:

CREATE TABLE [dbo].[Inventory](

...

<b>  [IsDrivable] [BIT] NOT NULL,</b>

...

GO

<b>ALTER TABLE [dbo].[Inventory] ADD  DEFAULT (CONVERT([BIT],(1)))</b>

<b>FOR [IsDrivable]</b>

GO

Вычисляемые столбцы

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

Inventory
вычисляемый столбец, который объединяет значения
PetName
и
Color
для создания
DisplayName
, применяйте функцию
HasComputedColumnSql()
:

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

{

  entity.Property(p =&gt; p.FullName)

<b>    .HasComputedColumnSql(&quot;[PetName] + ' (' + [Color] + ')'&quot;);</b>

});

В версии EF Core 5 появилась возможность сохранения вычисляемых значений, так что значение вычисляется только при создании или обновлении строки. Хотя в SQL Server упомянутая возможность поддерживается, она присутствует не во всех хранилищах данных, поэтому проверяйте документацию по своему поставщику баз данных:

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

{

  entity.Property(p =&gt; p.FullName)

    .HasComputedColumnSql(&quot;[PetName] + ' (' + [Color] + ')'&quot;, <b>stored:true</b>);

});

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

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

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

{

  ...

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

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

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

    .OnDelete(DeleteBehavior.ClientSetNull)

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

});

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

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

{

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - на сайте онлайн книг books-read.com Вы можете читать полные версии книг автора в одном месте.


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

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


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор books-read.com


Прокомментировать
Подтвердите что вы не робот:*