С помощью метода 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:
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], который устанавливает минимальную длину, но он на определение таблицы не влияет.
В 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; } }