Что ж, вопрос достаточно ясен. Можно ли создавать пространственные индексы с помощью Entity Framework 6.1 Fluent API?
Как создать пространственный индекс с помощью API Fluent EF 6.1
Ответы (2)
Краткий ответ - нет, это не так. Я видел косвенные ссылки на это в блогах. и не нашли конкретных примеров реализации. Похоже, это связано с тем, что пространственные индексы являются отфильтрованными индексами, которые не поддерживаются в Entity Framework.
В качестве поддержки моего ответа я создал консольное приложение POC с самой последней версией Entity Framework (6.1). Я сделал следующие шаги
- Создал модель со свойством типа DbGeography
- Включены автоматические миграции
Ran Update-Database -verbose, обеспечивающий миграцию с добавлением индекса. В индексе использовалось следующее:
modelBuilder.Entity<LocationEntity>().Property(t => t.Coordinates).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("ix_locationentity_coordinates")));
Индексы не создавались, но и приложение не вылетало. Я мог бы попробовать перестановки в этом, но мой пример, похоже, следует соглашению о структуре сущностей: Официальная документация Fluent
Единственный известный мне способ сделать это - через "пользовательскую" миграцию. В 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.
[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