Язык программирования C#9 и платформа .NET5
Часть 435 из 642 Информация о книге
using Microsoft.EntityFrameworkCore;namespace AutoLot.Models.Entities.Owned{[Owned]public class Person{[Required, StringLength(50)]public string FirstName { get; set; } = "New";[Required, StringLength(50)]public string LastName { get; set; } = "Customer";[DatabaseGenerated(DatabaseGeneratedOption.Computed)]public string? FullName { get; set; }}}Свойство
допускаетFullName, т.к. до сохранения в базе данных новые сущности не будут иметь установленных значений. Финальная конфигурация свойстваnullобеспечивается с использованием Fluent API.FullnameСущность Car(Inventory)
Для таблицы
был создан шаблон сущностного класса по имениInventory, но имяInventoryпредпочтительнее. Исправить ситуацию легко: измените имя файла наCarи имя класса наCar.cs. АтрибутCarприменяется корректно, так что нужно просто добавить схему[Table]. Обратите внимание, что параметрdboнеобязателен, поскольку по умолчанию для SQL Server принимаетсяSchema, но он был включен ради полноты:dbo<b>[Table("Inventory", Schema = "dbo")]</b>[Index(nameof(MakeId), Name = "IX_Inventory_MakeId")]public partial class Car : BaseEntity{...}Обновите операторы
следующим образом:usingusing 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;Унаследуйте класс
отCar, после чего удалите свойстваBaseEntityиId, конструктор и директивуTimeStamp. Вот как выглядит код класса после таких изменений:#pragma nullable disablenamespace 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<Order> Orders { get; set; }}}В коде все еще присутствуют проблемы, которые необходимо устранить. Свойства
иColorопределены как не допускающиеPetName, но их значения не устанавливаются в конструкторе или не инициализируются в определении свойств. Проблема решается с помощью инициализаторов свойств. Кроме того, добавьте к свойствуnullатрибутPetName, чтобы сделать название свойства более удобным для восприятия человеком. Обновите свойства, как показано ниже (изменения выделены полужирным):[DisplayName][Required][StringLength(50)]public string Color { get; set; } = <b>"Gold"</b>;[Required][StringLength(50)]<b>[DisplayName("Pet Name")]</b>public string PetName { get; set; } = <b>"My Precious"</b>;На заметку! Атрибут
используется инфраструктурой ASP.NET Core и будет описан в части VIII.[DisplayName]Навигационное свойство
потребуется переименовать вMakeи сделать допускающимMakeNavigation, а в обратном навигационном свойстве вместо "магической" строки должно применяться выражениеnullязыка С#. Наконец, нужно удалить модификаторnameof. После всех модификаций свойство приобретает следующий вид:virtual[ForeignKey(nameof(MakeId))]