Создать уникальное ограничение для 'true' только в EF Core - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть класс для отслеживания вложений в запись. Каждая запись может иметь несколько записей RecordAttachments, но существует требование, чтобы на каждую запись мог быть только один RecordAttachment, помеченный как IsPrimary.

public class RecordAttachment
{
    public int Id { get; set; }
    public int RecordId { get; set; }
    public string Details { get; set; }
    public bool IsPrimary { get; set; }

    public Record Record { get; set; }
}

Я не могу просто использовать .HasIndex(e => new { e.RecordId, e.IsPrimary }).IsUnique(true), поскольку в одной записи может быть несколько false значений.

В основном мне нужно уникальное ограничение для RecordId и IsPrimary == true, хотя это не сработало:

entity.HasIndex(e => new { e.RecordId, IsPrimary = (e.IsPrimary == true) }).IsUnique(true)

Edit: Глядя на такие ответы: Уникальное ограничение для битовых столбцов, допускающее только 1 True (1) значение кажется, что было бы возможно создать ограничение непосредственно с помощью SQL, но тогда оно не будет отражено в моей модели.

1 Ответ

0 голосов
/ 28 апреля 2018

Вы можете указать индексный фильтр, используя свободный интерфейс HasFilter.

К сожалению, это не зависит от базы данных, поэтому вы должны использовать синтаксис SQL целевой базы данных и фактические имена столбцов таблицы.

Для Sql Server это будет примерно так:

.HasIndex(e => new { e.RecordId, e.IsPrimary })
.IsUnique()
.HasFilter("[IsPrimary] = 1");

Для получения дополнительной информации см. Моделирование реляционной базы данных - индексы Документация.

...