private string _color = "Gold";
public string Color
{
get => _color;
set => _color = value;
}
Аннотации данных Entity Framework
Аннотации данных — это атрибуты С#, которые применяются для дальнейшего придания формы вашим сущностям. В табл. 22.8 описаны самые часто используемые аннотации данных, предназначенные для определения деталей того, как ваши сущностные классы и свойства сопоставляются с таблицами и полями базы данных. Аннотации данных переопределяют любые конфликтующие соглашения. В оставшемся материале главы и книги вы увидите еще много аннотаций, которые можно применять для уточнения сущностей в модели.
В следующем коде показан класс
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("Inventory", Schema="dbo")]</b>
<b>[Index(nameof(MakeId), Name = "IX_Inventory_MakeId")]</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<Driver> 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.