Обязательные и необязательные свойства

Последнее обновление: 19.11.2021

Обязательные свойства

По умолчанию свойство является необязательным к установке, если оно допускает значение 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

Атрибут 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();
}

Метод IsRequired

То же самое можно сделать и через 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; }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850