Затем добавьте свойство NotMapped
Make экземпляра Car, устранив необходимость в классе CarViewModel из главы 21. Если связанная информация Make была извлечена из базы данных с записью Car, то значение MakeName отображается. Если связанные данные не были извлечены, тогда для свойства отображается строка Unknown (т.е. производитель не известен). Как вы должны помнить, свойства с атрибутом [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] и [DisplayName]. Несмотря на то что инфраструктура EF Core считает свойство MakeId обязательным, т.к. оно не допускает значение null, механизму проверки достоверности ASP.NET Core нужен атрибут [Required]. Ниже приведен модифицированный код:[Required]
[DisplayName("Make")]
public int MakeId { get; set; }
Финальное изменение заключается в добавлении свойства IsDrivable
bool, не допускающего значения null, с поддерживающим полем, допускающим null, и отображаемым именем:private bool? _isDrivable;
[DisplayName("Is Drivable")]
public bool IsDrivable
{
get => _isDrivable ?? false;
set => _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
{
[Table("Customers", Schema = "dbo")]
public partial class Customer : BaseEntity
{
[InverseProperty(nameof(CreditRisk.Customer))]
public virtual ICollection
[InverseProperty(nameof(Order.Customer))]
public virtual ICollection
}
}
Подобно сущностному классу Car
[Jsonlgnore], атрибуты обратных навигационных свойств потребуется обновить с использованием суффикса Navigation, типы необходимо изменить на IEnumerable с инициализацией, а модификатор virtual удалить. Ниже показан модифицированный код:[JsonIgnore]
[InverseProperty(nameof(CreditRisk.CustomerNavigation))]
public IEnumerable
new List
[JsonIgnore]
[InverseProperty(nameof(Order.CustomerNavigation))]
public IEnumerable
Осталось лишь добавить свойство с типом принадлежащего сущностного класса. Отношение будет позже сконфигурировано посредством Fluent API.
public Person PersonalInformation { get; set; } = new Person;
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT