Аннотации данных — это атрибуты С#, которые применяются для дальнейшего придания формы вашим сущностям. В табл. 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
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[TimeStamp]
public byte[] TimeStamp { get; set; }
}
Вот класс Car
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
[Table("Inventory", Schema="dbo")]
[Index(nameof(MakeId), Name = "IX_Inventory_MakeId")]
public class Car : BaseEntity
{
[Required, StringLength(50)]
public string Color { get; set; }
[Required, StringLength(50)]
public string PetName { get; set; }
public int MakeId { get; set; }
[ForeignKey(nameof(MakeId))]
public Make MakeNavigation { get; set; }
[InverseProperty(nameof(Driver.Cars))]
public IEnumerable
}
Атрибут [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.
ApplicationDbContext