Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
Принадлежащий сущностный класс Person
Сущности Customer и CreditRisk имеют свойства FirstName и LastName. Если в каждой сущности присутствуют одни и те же свойства, тогда можно извлечь выгоду от перемещения этих свойств в принадлежащие классы. Пример с двумя свойствами тривиален, но принадлежащие сущностные классы помогают сократить дублирование кода и повысить согласованность. В дополнение к двум свойствам внутри классов определяется еще одно свойство, отображаемое на вычисляемый столбец SQL Server.
Создайте в каталоге Entities проекта AutoLot.Models новый каталог по имени Owned и добавьте в него новый файл Person.cs, содержимое которого показано ниже:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
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, т.к. до сохранения в базе данных новые сущности не будут иметь установленных значений. Финальная конфигурация свойства Fullname обеспечивается с использованием Fluent API.
Сущность Car(Inventory)
Для таблицы Inventory был создан шаблон сущностного класса по имени Inventory, но имя Car предпочтительнее. Исправить ситуацию легко: измените имя файла на Car.cs и имя класса на Car. Атрибут [Table] применяется корректно, так что нужно просто добавить схему dbo. Обратите внимание, что параметр Schema необязателен, поскольку по умолчанию для SQL Server принимается dbo, но он был включен ради полноты:
[Table("Inventory", Schema = "dbo")]
[Index(nameof(MakeId), Name = "IX_Inventory_MakeId")]
public partial class Car : BaseEntity
{
...
}
Обновите операторы 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;
Унаследуйте класс 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<Order> Orders { get; set; }
}
}
В коде все еще присутствуют проблемы, которые необходимо устранить. Свойства 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<Order>, а не ICollection<Order>, и инициализироваться с применением нового экземпляра List<Order>. Изменение не является обязательным, потому что ICollection<Order> тоже будет работать. Более низкоуровневый тип IEnumerable<T> предпочтительнее использовать с навигационными свойствами типа коллекций IEnumerable<T> (поскольку интерфейсы IQueryable<T> и ICollection<T> унаследованы от IEnumerable<T>). Модифицируйте код, как показано далее:
[JsonIgnore]
[InverseProperty(nameof(Order.CarNavigation))]
public IEnumerable<Order> Orders { get; set; } = new List<Order>();
Затем добавьте свойство 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, механизму проверки
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова