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
в классе
BaseEntity
. Имена совпадают, но в этой таблице оно хранит дату и время регистрации записи в журнале (что будет конфигурироваться как стандартная настройка SQL Server), а не
rowversion
в других сущностях.
Класс ApplicationDbContext
Пришло время обновить файл
ApplicationDbContext.cs
. Начните с приведения операторов
using
к такому виду:
using 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
Первое изменение, вносимое в метод
OnModelCreating()
, касается добавления кода Fluent API для конфигурирования сущности
SeriLogEntry
. Свойство
Properties
является XML-столбцом SQL Server, а свойство
TimeStamp
отображается в SQL Server на столбец
datetime2
со стандартным значением, установленным в результат функции
getdate()
из SQL Server. Добавьте в метод
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
с изменениями, выделенными полужирным: