Литмир - Электронная Библиотека
A
A

private string _color = "Gold";

public string Color

{

  get => _color;

  set => _color = value;

}

Аннотации данных Entity Framework

Аннотации данных — это атрибуты С#, которые применяются для дальнейшего придания формы вашим сущностям. В табл. 22.8 описаны самые часто используемые аннотации данных, предназначенные для определения деталей того, как ваши сущностные классы и свойства сопоставляются с таблицами и полями базы данных. Аннотации данных переопределяют любые конфликтующие соглашения. В оставшемся материале главы и книги вы увидите еще много аннотаций, которые можно применять для уточнения сущностей в модели.

Язык программирования C#9 и платформа .NET5 - _164.png

В следующем коде показан класс

BaseEntity
с аннотацией, которая объявляет поле
Id
первичным ключом. Вторая аннотация свойства
Id
указывает, что оно является столбцом
Identity
в базе данных SQL Server. Свойство
TimeStamp
в SQL Server будет столбцом
timestamp/rowversion
(для проверки параллелизма, рассматриваемой позже в главе).

using System.ComponentModel.DataAnnotations;

using System.ComponentModel.DataAnnotations.Schema;

public abstract class BaseEntity

{

<b>  [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]</b>

  public int Id { get; set; }

<b>  [TimeStamp]</b>

  public byte[] TimeStamp { get; set; }

}

Вот класс

Car
и аннотации данных, которые придают ему форму в базе данных:

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations;

using System.ComponentModel.DataAnnotations.Schema;

using Microsoft.EntityFrameworkCore;

<b>[Table(&quot;Inventory&quot;, Schema=&quot;dbo&quot;)]</b>

<b>[Index(nameof(MakeId), Name = &quot;IX_Inventory_MakeId&quot;)]</b>

public class Car : BaseEntity

{

<b>  [Required, StringLength(50)]</b>

  public string Color { get; set; }

<b>  [Required, StringLength(50)]</b>

  public string PetName { get; set; }

  public int MakeId { get; set; }

<b>  [ForeignKey(nameof(MakeId))]</b>

  public Make MakeNavigation { get; set; }

<b>  [InverseProperty(nameof(Driver.Cars))]</b>

  public IEnumerable&lt;Driver&gt; Drivers { get; set; }

}

Атрибут

[Table]
сопоставляет класс
Car
с таблицей Inventory в схеме
dbo
(атрибут
[Column]
применяется для изменения имени столбца или типа данных). Атрибут
[Index]
создает индекс на внешнем ключе
MakeId
. Два строковых поля установлены как
[Required]
и имеющие максимальную длину(
StringLength
) в 50 символов. Атрибуты
[InverseProperty]
и
[ForeignKey]
объясняются в следующем разделе.

Ниже перечислены отличия от соглашений EF Core:

• переименование таблицы из

Cars
в
Inventory
;

• изменение типа данных столбца

TimeStamp
из
varbinary(max)
на
timestamp
в SQL Server;

• установка типа данных и допустимости значения

null
для столбцов
Color
и
PetName
вместо
nvarchar(max)/null
в
nvarchar(50)/
не
null
;

• переименование индекса в

MakeId
.

Остальные используемые аннотации соответствуют конфигурации, определенной соглашениями EF Core.

Если вы создадите миграцию и попробуете ее применить, то миграция потерпит неудачу. СУБД SQL Server не разрешает изменять любой тип данных существующего столбца на

timestamp
. Столбец должен быть удален и затем воссоздан. К сожалению, инфраструктура миграций не позволяет удалять и воссоздавать, а пытается изменить столбец.

Вот как проще всего решить проблему: поместить свойство

TimeStamp
в комментарий внутри базовой сущности, создать и применить миграцию, убрать комментарий со свойства
TimeStamp
и затем создать и применить еще одну миграцию.

Закомментируйте свойство

TimeStamp
вместе с аннотацией данных и выполните следующие команды:

dotnet ef migrations add RemoveTimeStamp -o Migrations

 -c AutoLot.Samples.

ApplicationDbContext

dotnet ef database update RemoveTimeStamp

 -c AutoLot.Samples.ApplicationDbContext

Уберите комментарий со свойства

TimeStamp
и аннотации данных и выполните показанные далее команды, чтобы добавить свойство
TimeStamp
в таблицу как столбец
timestamp
:

dotnet ef migrations add ReplaceTimeStamp -o Migrations

 -c AutoLot.Samples.

417
{"b":"847442","o":1}