Как с помощьюigrationBuilder можно определить, какие индексы создать? - PullRequest
0 голосов
/ 24 июня 2018

Это использует ядро ​​asp.net 2.0, EF, Visual Studio 2017, SQL Server 2016 и создание миграции базы данных через консоль диспетчера пакетов с помощью инструмента «add -igration» в консоли диспетчера пакетов.

У меня есть простое отношение «многие ко многим», настроенное, как показано ниже, 2 таблицы и третья «таблица присоединения»:

public class TblTrack
{
    public int ID { get; set; }

     ...

    //Navigation properties
    public List<TblProductItem> ProductItems { get; set; }
}


public class TblProduct
{
    public int ID { get; set; }

    ...

    //Navigation properties
    public List<TblProductItem> ProductItems { get; set; }
}

public class TblProductItem
{
    [Key]
    [Required]
    public int ProductID { get; set; }

    [Key]
    [Required]
    public int TrackID { get; set; }


    //Navigation properties
    public TblProduct Product { get; set; }
    public TblTrack Track { get; set; }
}

Это из миграции (сгенерированной в PMC) для создания таблицы объединения:

migrationBuilder.AddPrimaryKey(
name: "PK_tbl_ProductItems",
table: "tbl_ProductItems",
columns: new[] { "ProductID", "TrackID" });

migrationBuilder.CreateIndex(
name: "IX_tbl_ProductItems_TrackID",
table: "tbl_ProductItems",
column: "TrackID");

Пожалуйста, кто-нибудь может объяснить:

Какова цель индекса IX_tbl_ProductItems_TrackID?

Почему индекс был создан для TrackID, но не для ProductID?

Существуют ли другие параметры, определяющие, какие индексы будут создаваться при миграции?

1 Ответ

0 голосов
/ 24 июня 2018

По умолчанию EF автоматически создает индекс (неуникальный) для каждого свойства, которое является ссылкой на внешний ключ.

Убедитесь, что EF правильно создал связь между TblProduct и TblProductItem (например, в SQL Server путем расширения ключей) - если нет, укажите связь явно, используя Fluent Api.

Что касается других настроек, вам может потребоваться создание индексов с использованием метода в вашем классе Context, но этот индекс должен генерироваться автоматически, если установлено отношение внешнего ключа.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TblProductItem>()
        .HasIndex(e => e.TrackID);
}
...