public DbSet? Customers { get; set; }

public DbSet? Makes { get; set; }

public DbSet? Cars { get; set; }

public DbSet? Orders { get; set; }

<p id="AutBody_Root972"><strong>Обновление кода Fluent API</strong></p>

Код Fluent API находится в переопределенной версии метода OnModelCreating() и использует экземпляр класса ModelBuilder для обновления модели.

<p id="AutBody_Root973"><strong>Сущность SeriLogEntry</strong></p>

Первое изменение, вносимое в метод OnModelCreating(), касается добавления кода Fluent API для конфигурирования сущности SeriLogEntry. Свойство Properties является XML-столбцом SQL Server, а свойство TimeStamp отображается в SQL Server на столбец datetime2 со стандартным значением, установленным в результат функции getdate() из SQL Server. Добавьте в метод OnModelCreating() следующий код:

modelBuilder.Entity(entity =>

{

  entity.Property(e => e.Properties).HasColumnType("Xml");

  entity.Property(e => e.TimeStamp).HasDefaultValueSql("GetDate()");

});

<p id="AutBody_Root974"><strong>Сущность CreditRisk</strong></p>

Далее понадобится модифицировать код сущности CreditRisk. Блок конфигурирования для столбца TimeStamp удаляется, т.к. столбец конфигурируется в BaseEntity. Код конфигурирования навигации должен быть скорректирован с учетом новых имен. Кроме того, выполняется утверждение о том, что навигационное свойство не равно null. Другое изменение связано с конфигурированием свойства типа принадлежащей сущности, чтобы сопоставить с именами столбцов для FirstName и LastName, и добавлением вычисляемого значения для свойства FullName. Ниже показан обновленный блок для сущности CreditRisk с изменениями, выделенными полужирным:

modelBuilder.Entity(entity =>

{

  entity.HasOne(d => d.CustomerNavigation)

      .WithMany(p => p!.CreditRisks)

      .HasForeignKey(d => d.CustomerId)

      .HasConstraintName("FK_CreditRisks_Customers");

  entity.OwnsOne(o => o.PersonalInformation,

    pd =>

    {

      pd.Property(nameof(Person.FirstName))

           .HasColumnName(nameof(Person.FirstName))

           .HasColumnType("nvarchar(50)");

      pd.Property(nameof(Person.LastName))

           .HasColumnName(nameof(Person.LastName))

           .HasColumnType("nvarchar(50)");

      pd.Property(p => p.FullName)

           .HasColumnName(nameof(Person.FullName))

           .HasComputedColumnSql("[LastName] + ', ' + [FirstName]");

    });

});

<p id="AutBody_Root975"><strong>Сущность Customer</strong></p>

Следующим обновляется блок для сущности Customer. Здесь удаляется код для TimeStamp и конфигурируются свойства принадлежащего сущностного класса:

modelBuilder.Entity(entity =>

{

  entity.OwnsOne(o => o.PersonalInformation,

 pd =>

  {

    pd.Property(p => p.FirstName).HasColumnName(nameof(Person.FirstName));

    pd.Property(p => p.LastName).HasColumnName(nameof(Person.LastName));

    pd.Property(p => p.FullName)

      .HasColumnName(nameof(Person.FullName))

      .HasComputedColumnSql("[LastName] + ', ' + [FirstName]");

   });

});

<p id="AutBody_Root976"><strong>Сущность Make</strong></p>

Для сущности Make необходимо модифицировать блок конфигурирования, удалив свойство TimeStamp и добавив код, который ограничивает удаление сущности, имеющей зависимые сущности:

modelBuilder.Entity(entity =>

{

  entity.HasMany(e => e.Cars)

      .WithOne(c => c.MakeNavigation!)

      .HasForeignKey(k => k.MakeId)

      .OnDelete(DeleteBehavior.Restrict)

      .HasConstraintName("FK_Make_Inventory");

});

<p id="AutBody_Root977"><strong>Сущность Order</strong></p>

Для сущности Order обновите имена навигационных свойств и добавьте утверждение, что обратные навигационные свойства не равны null. Вместо ограничения удалений отношение Customer с Order настраивается на каскадное удаление:

modelBuilder.Entity(entity =>

{

Перейти на страницу:

Похожие книги