Как создать пространственный индекс с помощью API Fluent EF 6.1

Что ж, вопрос достаточно ясен. Можно ли создавать пространственные индексы с помощью Entity Framework 6.1 Fluent API?


person amiry jd    schedule 15.07.2014    source источник


Ответы (2)


Краткий ответ - нет, это не так. Я видел косвенные ссылки на это в блогах. и не нашли конкретных примеров реализации. Похоже, это связано с тем, что пространственные индексы являются отфильтрованными индексами, которые не поддерживаются в Entity Framework.

В качестве поддержки моего ответа я создал консольное приложение POC с самой последней версией Entity Framework (6.1). Я сделал следующие шаги

  1. Создал модель со свойством типа DbGeography
  2. Включены автоматические миграции
  3. Ran Update-Database -verbose, обеспечивающий миграцию с добавлением индекса. В индексе использовалось следующее:

    modelBuilder.Entity<LocationEntity>().Property(t => t.Coordinates).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("ix_locationentity_coordinates")));

Индексы не создавались, но и приложение не вылетало. Я мог бы попробовать перестановки в этом, но мой пример, похоже, следует соглашению о структуре сущностей: Официальная документация Fluent

person Craig    schedule 28.04.2015

Единственный известный мне способ сделать это - через "пользовательскую" миграцию. В EF6 я добавляю миграцию (в приведенном ниже примере она называется «V1»), в результате чего создается новая миграция с пустыми методами Up() и Down(). Затем вы можете добавить пользовательские команды SQL к этим методам перед запуском update-database, чтобы поместить их в «обычный» поток миграции.

Можно изменить существующую миграцию, чтобы добавить эти функции, но на практике я предпочитаю, чтобы мои автоматически созданные миграции были отделены от моих настроенных.

public partial class V1 : DbMigration
{
    public override void Up()
    {
        Sql("CREATE SPATIAL INDEX [IX_UserProfileAddresses_Location] ON [dbo].[UserProfileAddresses](Location)");
    }

    public override void Down()
    {
        Sql("DROP INDEX [IX_UserProfileAddresses_Location] ON [dbo].[UserProfileAddresses]");
    }
}

Не идеальный метод, но не так уж и плохо, поскольку он соответствует «нормальному» шаблону миграции для EF.

person R. Lennox    schedule 06.04.2016
comment
Это лучший вариант, который я нашел и для EF 6.2. Если вы используете обычный [Index] как Data Annotations для DbGeography, вы получите следующую ошибку при обновлении базы данных: Column 'Area' in table 'dbo.YourTable' is of a type that is invalid for use as a key column in an index or statistics. - person Ogglas; 17.11.2018