Установка уникального пустого столбца без указания индекса. NET EF Core - PullRequest
1 голос
/ 30 марта 2020

Я хотел бы добавить в таблицу поле, которое должно быть уникальным, но не обязательным (поэтому оно может быть нулевым) и не является индексом. Это выполнимо с SQL, что-то вроде этого в mysql:

CREATE TABLE MyTable (
  ...
  field VARCHAR(255) UNIQUE
  ...
)

Я попытался переопределить DbContext.OnModelCreating и добавил:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // this creates an index, which I don't need/want for this field
    modelBuilder.Entity<User>()
        .HasIndex(x => x.Field)
        .IsUnique();

}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // This creates a NOT NULL Constraint
    modelBuilder.Entity<User>()
        .HasAlternateKey(x => x.Field);
}

Код ниже выдает мне сообщение об ошибке: The property 'Field' on entity type 'User' cannot be marked as nullable/optional because it has been included in a key {'Field'}.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // This gives me an error
    modelBuilder.Entity<User>()
        .HasAlternateKey(x => x.Field);
    modelBuilder.Entity<User>()
        .Property(x => x.Field)
        .IsRequired(false);
}

Если бы у меня был способ просто добавить SQL вручную, я был бы согласен с этим. Я не знаю, возможно ли это, если я отредактирую файл миграции вручную, но файлы migration.Design.cs используют тот же класс ModelBuilder, поэтому у меня есть только те же методы для работы.

1 Ответ

0 голосов
/ 30 марта 2020

Я сталкивался с этой проблемой раньше. Причина, по которой это невозможно сделать с помощью свободного API, наиболее вероятна (я предполагаю), потому что несколько баз данных не поддерживают эту функцию, и это имеет смысл. В этом посте объясняется, почему:

MySQL: УНИКАЛЬНОЕ ограничение без индекса

Если вы все еще хотите это сделать, просто запустите команду OnModelCreating следующим образом:

context.Database.ExecuteSqlCommand("ALTER TABLE table
DROP CONSTRAINT table_constraint"); //SQL Server / Oracle / MS Access
...