Язык программирования C#9 и платформа .NET5
Часть 436 из 642 Информация о книге
[InverseProperty(<b>nameof(Make.Cars)</b>)]public Make? MakeNavigation { get; set; }На заметку! Модификатор
необходим для ленивой загрузки. Поскольку ленивая загрузка в примерах книги не используется, модификаторvirtualбудет удаляться из всех свойств внутри уровня доступа к данным.virtualДля навигационного свойства
требуется атрибутOrders, чтобы предотвратить циклические ссылки JSON при сериализации объектной модели. В шаблонном коде обратное навигационное свойство задействует выражение[Jsonlgnore], но его понадобится обновить, т.к. имена всех навигационных свойств типа ссылок будут содержать суффиксnameof. Последнее изменение связано с тем, что свойство должно иметь типNavigation, а неIEnumerable<Order>, и инициализироваться с применением нового экземпляраICollection<Order>. Изменение не является обязательным, потому чтоList<Order>тоже будет работать. Более низкоуровневый типICollection<Order>предпочтительнее использовать с навигационными свойствами типа коллекцийIEnumerable<T>(поскольку интерфейсыIEnumerable<T>иIQueryable<T>унаследованы отICollection<T>). Модифицируйте код, как показано далее:IEnumerable<T><b>[JsonIgnore]</b>[InverseProperty(nameof(Order.Car<b>Navigation</b>))]public <b>IEnumerable</b><Order> Orders { get; set; } = <b>new List<Order>()</b>;Затем добавьте свойство
, которое будет отображать значениеNotMappedэкземпляраMake, устранив необходимость в классеCarиз главы 21. Если связанная информацияCarViewModelбыла извлечена из базы данных с записьюMake, то значениеCarотображается. Если связанные данные не были извлечены, тогда для свойства отображается строка Unknown (т.е. производитель не известен). Как вы должны помнить, свойства с атрибутомMakeNameне относятся к базе данных и существуют только внутри сущности. Добавьте следующий код:[NotMapped][NotMapped]public string MakeName => MakeNavigation?.Name ?? "Unknown";Переопределите
для отображения информации о транспортном средстве:ToString()public override string ToString(){// Поскольку столбец PetName может быть пустым,.// определить стандартное имя **No Name**return $"{PetName ?? "**No Name**"} is a {Color} {MakeNavigation?.Name}with ID {Id}.";}Добавьте к свойству
атрибутыMakeIdи[Required]. Несмотря на то что инфраструктура EF Core считает свойство[DisplayName]обязательным, т.к. оно не допускает значениеMakeId, механизму проверки достоверности ASP.NET Core нужен атрибутnull. Ниже приведен модифицированный код:[Required]<b>[Required]</b><b>[DisplayName("Make")]</b>public int MakeId { get; set; }Финальное изменение заключается в добавлении свойства
типаIsDrivable, не допускающего значенияbool, с поддерживающим полем, допускающимnull, и отображаемым именем:nullprivate bool? _isDrivable;[DisplayName("Is Drivable")]public bool IsDrivable{get => _isDrivable ?? false;set => _isDrivable = value;}На этом обновление сущностного класса
завершено.CarСущность Customer
Для таблицы
был создан шаблонный сущностный класс по имениCustomers. Приведите операторыCustomerк следующему виду:usingusing 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. Вот как выглядит код в настоящий момент:Personnamespace AutoLot.Models.Entities