Как создать индекс в Entity Framework 6.2 с первым кодом

ef-code-first entity-framework entity-framework-6

Вопрос

Есть ли способ создать индекс для свойства / столбца, используя сначала код, а не использовать новый IndexAttribute ?

Принятый ответ

Хорошо 26.10.2017 Entity Framework 6.2 был официально выпущен . Он включает в себя возможность легко определять индексы с помощью Fluent API. Но это уже было объявлено в бета-версии 6.2.

Теперь вы можете использовать метод HasIndex() , а затем IsUnique() если это должен быть уникальный индекс.

Небольшое сравнение (до / после):

// before 
modelBuilder.Entity<Person>()
        .Property(e => e.Name)
        .HasColumnAnnotation(
            IndexAnnotation.AnnotationName, 
            new IndexAnnotation(new IndexAttribute { IsUnique = true }));

// after
modelBuilder.Entity<Person>()
    .HasIndex(p => p.Name)
    .IsUnique();

// multi column index
modelBuilder.Entity<Person>()
    .HasIndex(p => new { p.Name, p.Firstname })
    .IsUnique();

Также можно пометить индекс как кластеризованный с помощью .IsClustered() .


РЕДАКТИРОВАТЬ # 1

Добавлен пример многостолбцового индекса и дополнительная информация о том, как пометить индекс как кластерный.


РЕДАКТИРОВАТЬ № 2

Как дополнительная информация, в EF Core 2.1 это точно так же, как в EF 6.2 сейчас.
Вот MSc Doc artcile в качестве ссылки.


Популярные ответы

В настоящее время нет поддержки «первого класса» для создания индекса через свободный API, но то, что вы можете сделать, - это свободный API, который можно пометить как атрибуты из API аннотаций. Это позволит вам добавить атрибут Index через свободный интерфейс.

Вот несколько примеров из рабочего элемента сайта проблем для EF.

Создайте индекс в одном столбце:

modelBuilder.Entity<MyEntity>()
    .Property(e => e.MyProperty)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName, 
        new IndexAnnotation(new IndexAttribute()));

Несколько индексов в одном столбце:

modelBuilder.Entity<MyEntity>()
    .Property(e => e.MyProperty)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName, 
        new IndexAnnotation(new[]
            {
                new IndexAttribute("Index1"),
                new IndexAttribute("Index2") { IsUnique = true }
            }));

Многоколоночные индексы:

modelBuilder.Entity<MyEntity>()
    .Property(e => e.MyProperty1)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName,
        new IndexAnnotation(new IndexAttribute("MyIndex", 1)));

modelBuilder.Entity<MyEntity>()
    .Property(e => e.MyProperty2)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName, 
        new IndexAnnotation(new IndexAttribute("MyIndex", 2)));

Использование вышеуказанных методов вызовет .CreateIndex() которые будут автоматически созданы для вас в вашей функции Up() когда вы поднимете следующую миграцию (или будете автоматически созданы в базе данных, если вы не используете миграции).




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему