Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
[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<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.
ApplicationDbContext
dotnet ef database update ReplaceTimeStamp
-c AutoLot.Samples.ApplicationDbContext
Теперь база данных соответствует вашей модели.
Аннотации и навигационные свойства
Аннотация ForeignKey позволяет EF Core знать, какое свойство является поддерживающим полем для навигационного свойства. По соглашению <ИмяТипа>Id автоматически станет свойством внешнего ключа, но в предыдущем примере оно было установлено явно. Такой подход обеспечивает отличающиеся стили именования, а также наличие в таблице более одного внешнего ключа. Кроме того, улучшается читабельность кода.
Свойство InverseProperty информирует EF Core о способе связывания таблиц, указывая навигационное свойство в других сущностях, которое направляет обратно в текущую сущность. Свойство InverseProperty требуется, когда сущность связана с другой сущностью несколько раз, и вдобавок делает код более читабельным.
Интерфейс Fluent API
С помощью интерфейса Fluent API сущности приложения конфигурируются посредством кода С#. Методы предоставляются экземпляром ModelBuilder, доступным в методе OnModelCreating() класса DbContext. Интерфейс Fluent API является самым мощным способом конфигурирования и переопределяет любые конфликтующие между собой соглашения или аннотации данных. Некоторые конфигурационные параметры доступны только через Fluent API, скажем, стандартные значения для настроек и каскадное поведение для навигационных свойств.
Отображение классов и свойств
В следующем коде воспроизведен предыдущий пример Car с использованием Fluent API вместо аннотаций данных (здесь не показаны навигационные свойства, которые будут раскрыты ниже):
modelBuilder.Entity<Car>(entity =>
{
entity.ToTable("Inventory","dbo");
entity.HasKey(e=>e.Id);
entity.HasIndex(e => e.MakeId, "IX_Inventory_MakeId");
entity.Property(e => e.Color)
.IsRequired()
.HasMaxLength(50);
entity.Property(e => e.PetName)
.IsRequired()
.HasMaxLength(50);
entity.Property(e => e.TimeStamp)
.IsRowVersion()
.IsConcurrencyToken();
});
Если создать и запустить миграцию прямо сейчас, то вы обнаружите, что ничего не изменилось, поскольку вызываемые методы Fluent API соответствуют текущей конфигурации, определенной соглашениями и аннотациями данных.
Стандартные значения
Интерфейс Fluent API предлагает методы, позволяющие устанавливать стандартные значения для столбцов. Стандартное значение может иметь тип значения или быть строкой SQL. Например, вот как установить стандартное значение Color для новой сущности Car в Black:
modelBuilder.Entity<Car>(entity =>
{
...
entity.Property(e => e.Color)
.HasColumnName("CarColor")
.IsRequired()
.HasMaxLength(50)
.HasDefaultValue("Black");
});
Чтобы установить значение для функции базы данных (вроде getdate()), применяйте метод HasDefaultValueSql(). Предположим, что в класс Car было добавлено свойство DateTime по имени DateBuilt, а стандартным значением должна быть текущая дата, получаемая с использованием метода getdate() в SQL Server. Столбцы конфигурируются следующим образом:
modelBuilder.Entity<Car>(entity =>
{
...
entity.Property(e => e.DateBuilt)
.HasDefaultValueSql("getdate()");
});
Как и в случае применения SQL для вставки записи, если свойство, которое отображается на столбец со стандартным значением, имеет значение, когда EF Core вставляет запись, то вместо стандартного значения столбца будет использоваться значение свойства. Если значение свойства равно null, тогда применяется стандартное значение столбца.
Проблема возникает при наличии стандартного значения у типа данных свойства. Вспомните, что стандартное значение для числовых типов составляет 0, а для булевских — false. Если вы установите значение числового свойства в 0 или булевского свойства в false и затем вставите такую сущность, тогда инфраструктура EF Core будет трактовать это свойство как не имеющее установленного значения. При отображении свойства на столбец со стандартным значением используется стандартное значение в определении столбца.
Например, добавьте в класс Car свойство типа bool по имени IsDrivable. Установите в true стандартное значение для отображения
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Ма04 март 12:27
Эта книга первая из серии книг данного автора, их надо читать в определении порядке чтобы сохранить хронологию событий: 1. Илай и...
Манящая тьма - Рейвен Вуд
-
Ма04 март 12:25
Эта книга последняя из серии книг данного автора, их надо читать в определении порядке чтобы сохранить хронологию событий: 1....
Непреодолимая тьма - Рейвен Вуд
-
Иван03 март 07:32
Как интересно получается что мою книгу можно читать на каком-то левом сайте бесплатно. Вау вау вау....
Записки Администратора в Гильдии Авантюристов. 5 Том - Keil Kajima
