Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
[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<CreditRisk> CreditRisks { get; set; }
[InverseProperty(nameof(Order.Customer))]
public virtual ICollection<Order> Orders { get; set; }
}
}
Подобно сущностному классу Car в коде по-прежнему присутствуют проблемы, которые необходимо устранить, к тому же понадобится добавить принадлежащий сущностный класс. К навигационным свойствам нужно добавить атрибут [Jsonlgnore], атрибуты обратных навигационных свойств потребуется обновить с использованием суффикса Navigation, типы необходимо изменить на IEnumerable<T> с инициализацией, а модификатор virtual удалить. Ниже показан модифицированный код:
[JsonIgnore]
[InverseProperty(nameof(CreditRisk.CustomerNavigation))]
public IEnumerable<CreditRisk> CreditRisks { get; set; } =
new List<CreditRisk>();
[JsonIgnore]
[InverseProperty(nameof(Order.CustomerNavigation))]
public IEnumerable<Order> Orders { get; set; } = new List<Order>();
Осталось лишь добавить свойство с типом принадлежащего сущностного класса. Отношение будет позже сконфигурировано посредством Fluent API.
public Person PersonalInformation { get; set; } = new Person();
Итак, обновление сущностного класса Customer окончено.
Сущность Make
Для таблицы Makes был создан шаблонный сущностный класс по имени Make. Операторы using должны иметь следующий вид:
using System;
using System.Collections.Generic;
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;
Унаследуйте класс Make от BaseEntity и удалите свойства Id и TimeStamp. Удалите конструктор и директиву #pragma nullable disable, а затем добавьте атрибут [Table] со схемой. Вот текущий код сущностного класса:
namespace AutoLot.Models.Entities
{
[Table("Makes", Schema = "dbo")]
public partial class Make : BaseEntity
{
[Required]
[StringLength(50)]
public string Name { get; set; }
[InverseProperty(nameof(Inventory.Make))]
public virtual ICollection<Inventory> Inventories { get; set; }
}
}
В представленном далее коде демонстрируется инициализированное свойство Name, не допускающее null, и скорректированное навигационное свойство Cars (обратите внимание на изменение имени Inventory на Car в выражении nameof):
[Required]
[StringLength(50)]
public string Name { get; set; } = "Ford";
[JsonIgnore]
[InverseProperty(nameof(Car.MakeNavigation))]
public IEnumerable<Car> Cars { get; set; } = new List<Car>();
На этом сущностный класс Make завершен.
Сущность CreditRisk
Для таблицы CreditRisks был создан шаблонный сущностный класс по имени CreditRisk. Приведите операторы using к такому виду:
using System.ComponentModel.DataAnnotations.Schema;
using AutoLot.Models.Entities.Base;
using AutoLot.Models.Entities.Owned;
Унаследуйте класс CreditRisk от BaseEntityиудалите свойства Id и TimeStamp. Удалите конструктор и директиву #pragma nullable disable и добавьте атрибут [Table] со схемой. Удалите свойства FirstName и LastName, т.к. они будут заменены принадлежащим сущностным классом Person. Ниже показан обновленный код сущностного класса:
namespace AutoLot.Models.Entities
{
[Table("CreditRisks", Schema = "dbo")]
public partial class CreditRisk : BaseEntity
{
public Person PersonalInformation { get; set; } = new Person();
public int CustomerId { get; set; }
[ForeignKey(nameof(CustomerId))]
[InverseProperty("CreditRisks")]
public virtual Customer Customer { get; set; }
}
}
Исправьте навигационное свойство, для чего удалите модификатор virtual, используйте выражение nameof в атрибуте [InverseProperty] и добавьте к имени свойства суффикс Navigation:
[ForeignKey(nameof(CustomerId))]
[InverseProperty(nameof(Customer.CreditRisks))]
public Customer? CustomerNavigation { get; set; }
Финальное изменение заключается в добавлении свойства с типом принадлежащего сущностного класса. Отношение будет позже сконфигурировано посредством Fluent API.
public Person PersonalInformation { get; set; } = new Person();
Итак, сущностный класс CreditRisk закончен.
Сущность Order
Для таблицы Orders был создан шаблонный сущностный класс по имени Order. Модифицируйте операторы using следующим образом:
using System;
using System.ComponentModel.DataAnnotations.Schema;
using AutoLot.Models.Entities.Base;
using Microsoft.EntityFrameworkCore;
Унаследуйте класс Order от BaseEntity и удалите свойства Id и TimeStamp. Удалите конструктор и директиву #pragma nullable disable, а затем добавьте атрибут [Table] со схемой. Вот текущий код сущностного класса:
namespace AutoLot.Models.Entities
{
[Table("Orders", Schema = "dbo")]
[Index(nameof(CarId), Name = "IX_Orders_CarId")]
[Index(nameof(CustomerId), nameof(CarId),
Name = "IX_Orders_CustomerId_CarId", IsUnique = true)]
public partial class Order : BaseEntity
{
public int CustomerId { get; set; }
public int CarId { get; set; }
[ForeignKey(nameof(CarId))]
[InverseProperty(nameof(Inventory.Orders))]
public virtual Inventory Car { get; set; }
[ForeignKey(nameof(CustomerId))]
[InverseProperty("Orders")]
public virtual Customer { get; set; }
}
}
К именам навигационных свойств Car и Customer