Ограничения свойств

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

Установка ограничений

С помощью метода HasCheckConstraint() можно установить ограничение для столбца. На уровне базы данных это приведет к установке для столбца атрибута CHECK, который задает ограничение.

В метод HasCheckConstraint() передается название ограничения и sql-выражение, которое выполняет проверку корректности передаваемого значения. Например, у пользователя есть возраст, который должен укладываться в некоторые допустимые рамки. К примеру, возраст не может быть меньше 0 и больше 120:

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>()
            .ToTable(t => t.HasCheckConstraint("ValidAge", "Age > 0 AND Age < 120"));
    }
}

public class User
{
    public int Id { get; set; }
    public string? Name { get; set; }
    public int Age { get; set; }
}

В выражении

HasCheckConstraint("ValidAge", "Age > 0 AND Age < 120");

в качестве первого параметра передается название ограничения - в данном случае "ValidAge", а в качестве второго параметра - выражение SQL, которое будет использоваться в качестве ограничения.

В этом случае на уровне базы данных SQLite для сущности User будет создаваться следующая таблица:

CREATE TABLE "Users" (
	"Id"	INTEGER NOT NULL,
	"Name"	TEXT,
	"Age"	INTEGER NOT NULL,
	CONSTRAINT "PK_Users" PRIMARY KEY("Id" AUTOINCREMENT),
	CONSTRAINT "ValidAge" CHECK("Age" > 0 AND "Age" < 120)
);

Соответственно мы не сможем добавить в бд объект User, у которого значение свойства Age будет меньше 0 или больше 120.

using (ApplicationContext db = new ApplicationContext())
{
    User bob = new User() { Name = "Bob", Age = 123};
    db.Users.Add(bob);
    db.SaveChanges();	// ! Исключение 
}

Ограничения по длине

Как правило, по умолчанию для строкового свойства в таблице создается столбец для хранения строки неограниченной длины. Используя аннотации данных или Fluent API, мы можем ограничить строку по длине.

Ограничение максимальной длины применяется только к строкам и к массивам, например, byte[].

Атрибут MaxLength

В аннотациях данных ограничение по длине устанавливается с помощью атрибута MaxLength:

using System.ComponentModel.DataAnnotations;

public class User
{
	public int Id { get; set; }
    [MaxLength(50)]
    public string? Name { get; set; }
}

Стоит отметить, что данное ограничение будет действовать только для тех систем баз данных, которые поддерживают данную возможность. Например, для бд SQLite это не будет иметь никакого значения. А в случае с бд MS SQL Server столбец Name в базе данных будет иметь тип nvarchar(50) и тем самым иметь ограничение по длине.

Надо отметить, что также есть атрибут [MinLength], который устанавливает минимальную длину, но он на определение таблицы не влияет.

Метод HasMaxLength

В Fluent API ограничение по длине устанавливается с помощью метода HasMaxLength():

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).HasMaxLength(50);
    }
}

public class User
{
    public int Id { get; set; }
    public string? Name { get; set; }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850