Язык программирования C#9 и платформа .NET5
Часть 439 из 642 Информация о книге
using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Xml.Linq;namespace AutoLot.Models.Entities{[Table("SeriLogs", Schema = "Logging")]public class SeriLogEntry{[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]public int Id { get; set; }public string? Message { get; set; }public string? MessageTemplate { get; set; }[MaxLength(128)]public string? Level { get; set; }[DataType(DataType.DateTime)]public DateTime? TimeStamp { get; set; }public string? Exception { get; set; }public string? Properties { get; set; }public string? LogEvent { get; set; }public string? SourceContext { get; set; }public string? RequestPath { get; set; }public string? ActionName { get; set; }public string? ApplicationName { get; set; }public string? MachineName { get; set; }public string? FilePath { get; set; }public string? MemberName { get; set; }public int? LineNumber { get; set; }[NotMapped]public XElement? PropertiesXml=> (Properties != null)? XElement.Parse(Properties):null;}}Итак, сущностный класс
закончен.SeriLogEntryНа заметку! Свойство
в сущностном классеTimeStampотличается от свойстваSeriLogEntryв классеTimeStamp. Имена совпадают, но в этой таблице оно хранит дату и время регистрации записи в журнале (что будет конфигурироваться как стандартная настройка SQL Server), а неBaseEntityв других сущностях.rowversionКласс ApplicationDbContext
Пришло время обновить файл
. Начните с приведения операторовApplicationDbContext.csк такому виду:usingusing System;using System.Collections;using System.Collections.Generic;using AutoLot.Models.Entities;using AutoLot.Models.Entities.Owned;using Microsoft.EntityFrameworkCore;using Microsoft.EntityFrameworkCore.Storage;using Microsoft.EntityFrameworkCore.ChangeTracking;using AutoLot.Dal.Exceptions;Файл начинается с конструктора без параметров. Удалите его, т.к. он не нужен. Следующий конструктор принимает экземпляр
и пока подходит. Перехватчики событий дляDbContextOptionsиDbContextдобавляются позже в главе.ChangeTrackerСвойства
необходимо сделать допускающимиDbSet<T>, имена скорректировать, а модификаторыnullудалить. Теперь новую сущность для ведения журнала необходимо добавить. Перейдите к свойствамvirtualи модифицируйте их следующим образом:DbSet<T><b>public DbSet<SeriLogEntry>? LogEntries { get; set; }</b>public DbSet<CreditRisk>? CreditRisks { get; set; }public DbSet<Customer>? Customers { get; set; }public DbSet<Make>? Makes { get; set; }public DbSet<Car>? Cars { get; set; }public DbSet<Order>? Orders { get; set; }Обновление кода Fluent API
Код Fluent API находится в переопределенной версии метода
и использует экземпляр классаOnModelCreating()для обновления модели.ModelBuilderСущность SeriLogEntry
Первое изменение, вносимое в метод
, касается добавления кода Fluent API для конфигурирования сущностиOnModelCreating(). СвойствоSeriLogEntryявляется XML-столбцом SQL Server, а свойствоPropertiesотображается в SQL Server на столбецTimeStampсо стандартным значением, установленным в результат функцииdatetime2из SQL Server. Добавьте в методgetdate()следующий код:OnModelCreating()modelBuilder.Entity<SeriLogEntry>(entity =>{entity.Property(e => e.Properties).HasColumnType("Xml");entity.Property(e => e.TimeStamp).HasDefaultValueSql("GetDate()");});Сущность CreditRisk
Далее понадобится модифицировать код сущности
. Блок конфигурирования для столбцаCreditRiskудаляется, т.к. столбец конфигурируется вTimeStamp. Код конфигурирования навигации должен быть скорректирован с учетом новых имен. Кроме того, выполняется утверждение о том, что навигационное свойство не равноBaseEntity. Другое изменение связано с конфигурированием свойства типа принадлежащей сущности, чтобы сопоставить с именами столбцов дляnullиFirstName, и добавлением вычисляемого значения для свойстваLastName. Ниже показан обновленный блок для сущностиFullNameс изменениями, выделенными полужирным:CreditRisk