У меня есть этот столбец и enum: < /p>
public class MagicLinkToken : BaseEntity
{
public required string EmailAddress { get; set; }
public required string TokenHash { get; set; }
public required string IpAddress { get; set; }
public MagicLinkTokenStatus Status { get; set; } = MagicLinkTokenStatus.Active;
public required DateTime ExpiresAt { get; set; }
// signup
public string? FirstName { get; set; }
public string? LastName { get; set; }
}
public enum MagicLinkTokenStatus
{
Active, // Token is valid and ready to be used
Used, // Token has been successfully used for login/signup
Expired, // Token expired before being used
Revoked, // Token was manually invalidated (e.g., user requested a new link)
}
Я хочу добавить уникальное ограничение на tokenhash , но только тогда, когда статус является «активным». В базе данных данные в статусе сохраняются как строковое представление enum. Итак, я добавил это в свой контекст DB: < /p>
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity().Property(e => e.Status).HasConversion();
builder.Entity().HasIndex(t => t.TokenHash).IsUnique().HasFilter("\"Status\" = 'Active'");
}
Я написал тест для проверки этого фильтра, создав две сущности MagicLinkToken с одинаковым TokenHash и Status установить для «Active». Не было никакого исключения. Разве невозможно использовать HASFILTER в столбце с использованием преобразователя значений? Вот сгенерированная миграция: < /p>
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace FindSportsApi.Data.Migrations
{
///
public partial class MagicLinkTokenUniqueConstraint : Migration
{
///
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_MagicLinkTokens_TokenHash",
table: "MagicLinkTokens",
column: "TokenHash",
unique: true,
filter: "\"Status\" = 'Active'"
);
}
///
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(name: "IX_MagicLinkTokens_TokenHash", table: "MagicLinkTokens");
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... econverter