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

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Перейти на страницу:

[InverseProperty(<b>nameof(Make.Cars)</b>)]

public Make? MakeNavigation { get; set; }

На заметку! Модификатор

virtual
необходим для ленивой загрузки. Поскольку ленивая загрузка в примерах книги не используется, модификатор
virtual
будет удаляться из всех свойств внутри уровня доступа к данным.

Для навигационного свойства

Orders
требуется атрибут
[Jsonlgnore]
, чтобы предотвратить циклические ссылки JSON при сериализации объектной модели. В шаблонном коде обратное навигационное свойство задействует выражение
nameof
, но его понадобится обновить, т.к. имена всех навигационных свойств типа ссылок будут содержать суффикс
Navigation
. Последнее изменение связано с тем, что свойство должно иметь тип
IEnumerable&lt;Order&gt;
, а не
ICollection&lt;Order&gt;
, и инициализироваться с применением нового экземпляра
List&lt;Order&gt;
. Изменение не является обязательным, потому что
ICollection&lt;Order&gt;
тоже будет работать. Более низкоуровневый тип
IEnumerable&lt;T&gt;
предпочтительнее использовать с навигационными свойствами типа коллекций
IEnumerable&lt;T&gt;
(поскольку интерфейсы
IQueryable&lt;T&gt;
и
ICollection&lt;T&gt;
унаследованы от
IEnumerable&lt;T&gt;
). Модифицируйте код, как показано далее:

<b>[JsonIgnore]</b>

[InverseProperty(nameof(Order.Car<b>Navigation</b>))]

public <b>IEnumerable</b>&lt;Order&gt; Orders { get; set; } = <b>new List&lt;Order&gt;()</b>;

Затем добавьте свойство

NotMapped
, которое будет отображать значение
Make
экземпляра
Car
, устранив необходимость в классе
CarViewModel
из главы 21. Если связанная информация
Make
была извлечена из базы данных с записью
Car
, то значение
MakeName
отображается. Если связанные данные не были извлечены, тогда для свойства отображается строка Unknown (т.е. производитель не известен). Как вы должны помнить, свойства с атрибутом
[NotMapped]
не относятся к базе данных и существуют только внутри сущности. Добавьте следующий код:

[NotMapped]

public string MakeName =&gt; MakeNavigation?.Name ?? &quot;Unknown&quot;;

Переопределите

ToString()
для отображения информации о транспортном средстве:

public override string ToString()

{

  // Поскольку столбец PetName может быть пустым,
.

  // определить стандартное имя **No Name**

  return $&quot;{PetName ?? &quot;**No Name**&quot;} is a {Color} {MakeNavigation?.Name}

    with ID {Id}.&quot;;

}

Добавьте к свойству

MakeId
атрибуты
[Required]
и
[DisplayName]
. Несмотря на то что инфраструктура EF Core считает свойство
MakeId
обязательным, т.к. оно не допускает значение
null
, механизму проверки достоверности ASP.NET Core нужен атрибут
[Required]
. Ниже приведен модифицированный код:

<b>[Required]</b>

<b>[DisplayName(&quot;Make&quot;)]</b>

public int MakeId { get; set; }

Финальное изменение заключается в добавлении свойства

IsDrivable
типа
bool
, не допускающего значения
null
, с поддерживающим полем, допускающим
null
, и отображаемым именем:

private bool? _isDrivable;

[DisplayName(&quot;Is Drivable&quot;)]

public bool IsDrivable

{

  get =&gt; _isDrivable ?? false;

  set =&gt; _isDrivable = value;

}

На этом обновление сущностного класса

Car
завершено.

Сущность Customer

Для таблицы

Customers
был создан шаблонный сущностный класс по имени
Customer
. Приведите операторы
using
к следующему виду:

using System;

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations.Schema;

using System.Text.Json.Serialization;

using AutoLot.Models.Entities.Base;

using AutoLot.Models.Entities.Owned;

Унаследуйте класс

Customer
 от
BaseEntityn
удалите свойства
Id
и
TimeStamp
. Удалите конструктор и директиву
#pragma nullable disable
, после чего добавьте атрибут
[Table]
со схемой. Удалите свойства
FirstName
и
LastName
, т.к. они будут заменены принадлежащим сущностным классом
Person
. Вот как выглядит код в настоящий момент:

namespace AutoLot.Models.Entities

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