using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
using AutoLot.Models.Entities.Base;
using Microsoft.EntityFrameworkCore;
Унаследуйте класс Car
BaseEntity, после чего удалите свойства Id и TimeStamp, конструктор и директиву #pragma nullable disable. Вот как выглядит код класса после таких изменений:namespace AutoLot.Models.Entities
{
[Table("Inventory", Schema = "dbo")]
[Index(nameof(MakeId), Name = "IX_Inventory_MakeId")]
public partial class Car : BaseEntity
{
public int MakeId { get; set; }
[Required]
[StringLength(50)]
public string Color { get; set; }
[Required]
[StringLength(50)]
public string PetName { get; set; }
[ForeignKey(nameof(MakeId))]
[InverseProperty("Inventories")]
public virtual Make Make { get; set; }
[InverseProperty(nameof(Order.Car))]
public virtual ICollection
}
}
В коде все еще присутствуют проблемы, которые необходимо устранить. Свойства Color
PetName определены как не допускающие null, но их значения не устанавливаются в конструкторе или не инициализируются в определении свойств. Проблема решается с помощью инициализаторов свойств. Кроме того, добавьте к свойству PetName атрибут [DisplayName], чтобы сделать название свойства более удобным для восприятия человеком. Обновите свойства, как показано ниже (изменения выделены полужирным):[Required]
[StringLength(50)]
public string Color { get; set; } = "Gold"
[Required]
[StringLength(50)]
[DisplayName("Pet Name")]
public string PetName { get; set; } = "My Precious"
На заметку!
Атрибут[DisplayName] используется инфраструктурой ASP.NET Core и будет описан в части VIII.Навигационное свойство Make
MakeNavigation и сделать допускающим null, а в обратном навигационном свойстве вместо "магической" строки должно применяться выражение nameof языка С#. Наконец, нужно удалить модификатор virtual. После всех модификаций свойство приобретает следующий вид:[ForeignKey(nameof(MakeId))]
[InverseProperty(nameof(Make.Cars)
public Make? MakeNavigation { get; set; }
На заметку!
Модификаторvirtual необходим для ленивой загрузки. Поскольку ленивая загрузка в примерах книги не используется, модификатор virtual будет удаляться из всех свойств внутри уровня доступа к данным.Для навигационного свойства Orders
[Jsonlgnore], чтобы предотвратить циклические ссылки JSON при сериализации объектной модели. В шаблонном коде обратное навигационное свойство задействует выражение nameof, но его понадобится обновить, т.к. имена всех навигационных свойств типа ссылок будут содержать суффикс Navigation. Последнее изменение связано с тем, что свойство должно иметь тип IEnumerable, а не ICollection, и инициализироваться с применением нового экземпляра List. Изменение не является обязательным, потому что ICollection тоже будет работать. Более низкоуровневый тип IEnumerable предпочтительнее использовать с навигационными свойствами типа коллекций IEnumerable (поскольку интерфейсы IQueryable и ICollection унаследованы от IEnumerable). Модифицируйте код, как показано далее:[JsonIgnore]
[InverseProperty(nameof(Order.CarNavigation
public IEnumerable
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT