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


есть ли способ, чтобы создать индекс на имущество/колонки, используя код-во-первых, вместо того, чтобы использовать новый тег IndexAttribute ?

10 82

10 ответов:

Ну 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().

EDIT

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

в настоящее время нет "поддержка первого класса" для создания индекса через fluent API, но то, что вы можете сделать, это через fluent 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() функция при выполнении следующей миграции (или автоматически создается в базе данных, если вы не используете миграции).

Я создал некоторые методы расширения и завернул их в пакет NuGet, чтобы сделать это намного легче.

установить EntityFramework.IndexingExtensions пакет nuget.

затем вы можете сделать следующее:

public class MyDataContext : DbContext
{
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Entity<Customer>()
        .HasIndex("IX_Customers_Name",          // Provide the index name.
            e => e.Property(x => x.LastName),   // Specify at least one column.
            e => e.Property(x => x.FirstName))  // Multiple columns as desired.

        .HasIndex("IX_Customers_EmailAddress",  // Supports fluent chaining for more indexes.
            IndexOptions.Unique,                // Supports flags for unique and clustered.
            e => e.Property(x => x.EmailAddress)); 
  }
}

проект и исходный код здесь. Наслаждайтесь!

без явного имени:

[Index]
public int Rating { get; set; } 

С определенным именем:

[Index("PostRatingIndex")] 
public int Rating { get; set; }

начиная с EF 6.1 атрибут [Index] поддерживается.
Используйте [Index(IsUnique = true)] для уникального индекса.
Вот это ссылка от Microsoft

public class User 
{ 
    public int UserId { get; set; } 

    [Index(IsUnique = true)] 
    [StringLength(200)] 
    public string Username { get; set; } 

    public string DisplayName { get; set; } 
}

Entity Framework 6

Property(c => c.MyColumn)
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_MyIndex")));

и добавить с помощью:

using System.Data.Entity.Infrastructure.Annotations;
using System.ComponentModel.DataAnnotations.Schema;

вы можете использовать аннотацию данных индекса Код Первой Аннотации Данных

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

context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ..."); 

вы можете выполнить этот оператор в своем пользовательском DbInitializer производного класса. Я не знаю никакого свободного API-способа сделать это.

Я пишу метод расширения для использования в fluent EF, чтобы избежать дополнительного кода:

public static PrimitivePropertyConfiguration HasIndexAnnotation(
    this PrimitivePropertyConfiguration primitivePropertyConfiguration, 
    IndexAttribute indexAttribute = null
    )
{
    indexAttribute = indexAttribute ?? new IndexAttribute();

    return primitivePropertyConfiguration
        .HasColumnAnnotation(
            IndexAnnotation.AnnotationName, 
            new IndexAnnotation(indexAttribute)
        );
}

тогда используйте его так:

Property(t => t.CardNo)
    .HasIndexAnnotation();

или так, если индекс нуждается в некоторых конфигурациях:

Property(t => t.CardNo)
    .HasIndexAnnotation(new IndexAttribute("IX_Account") { IsUnique = true });

Вы можете использовать один из этих

// показатели

 this.HasIndex(e => e.IsActive)
            .HasName("IX_IsActive");

или

  this.Property(e => e.IsActive).HasColumnAnnotation(
            "Index",
            new IndexAnnotation(new IndexAttribute("IX_IsActive")));