По умолчанию свойство является необязательным к установке, если оно допускает значение null. Это свойства, которые представляют nullable-типы, например, string?, int? и т.д. Хотя мы также можем настроить эти свойства как обязательные.
Свойство является обязательным, если оно не допускает значение null.
Например, возьмем следующую модель:
public class User { public int Id { get; set; } public string Name { get; set; } = ""; public string? Company { get; set; } public int Age { get; set; } }
В данном случае свойство Name не представляет nullable-тип, поэтому оно рассматривается как обязательное (как и свойство Age). А свойство
Company представляет nullable-тип - string?
, соответственно является необязательным. Поэтому для этой сущности в SQLite будет сгенерирована
следующая таблица:
CREATE TABLE "Users" ( "Id" INTEGER NOT NULL, "Name" TEXT NOT NULL, "Company" TEXT, "Age" INTEGER NOT NULL, CONSTRAINT "PK_Users" PRIMARY KEY("Id" AUTOINCREMENT) );
Здесь мы видим, что столбец Company допускает значение NULL, а столбец Name - не допускает благодаря установке атрибута NOT NULL. Хотя здесь приведен пример бд SQLite, но для других систем баз данных будет действовать аналогичная логика.
Атрибут Required указывает, что данное свойство обязательно для установки, то есть будет иметь определение NOT NULL в БД, даже если оно представляет nullable-тип:
using System.ComponentModel.DataAnnotations; public class User { public int Id { get; set; } [Required] public string? Name { get; set; } }
А столбец Name в базе данных будет определен как NOT NULL.
Если мы не установим свойство Name у объекта User и попытаемся добавить этот объект в бд, то получим во время выполнения исключение типа Microsoft.EntityFrameworkCore.DbUpdateException:
using (ApplicationContext db = new ApplicationContext()) { User tom = new User(); db.Users.Add(tom); // ! ошибка Microsoft.EntityFrameworkCore.DbUpdateException db.SaveChanges(); }
То же самое можно сделать и через Fluent API с помощью метода IsRequired():
using Microsoft.EntityFrameworkCore; public class ApplicationContext : DbContext { public DbSet<User> Users { get; set; } = null!; public ApplicationContext() { Database.EnsureDeleted(); Database.EnsureCreated(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=helloapp.db"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>().Property(b => b.Name).IsRequired(); } } public class User { public int Id { get; set; } public string? Name { get; set; } }