如何使用EF 6.1 fluent API创建空间索引

时间:2014-07-15 05:07:56

标签: entity-framework spatial spatial-index entity-framework-6.1 ef-fluent-api

嗯,这个问题很清楚。是否可以使用Entity Framework 6.1流畅的API创建空间索引

2 个答案:

答案 0 :(得分:4)

我知道这样做的唯一方法是通过“自定义”迁移。在EF6中,我添加了一个迁移(在下面的示例中,它名为“V1”),导致使用空的Up()和Down()方法进行新的迁移。然后,您可以在运行update-database之前将自定义SQL命令添加到这些方法,以将这些命令放入“正常”迁移流程中。

可以修改现有迁移以添加这些功能,但我更倾向于将自动支架迁移与自定义迁移分开。

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的“正常”迁移模式。

答案 1 :(得分:1)

简短回答 - 不,不是。我已经在整个blogs中切向引用了这一点,并且没有找到具体的实现示例。这似乎与空间索引是过滤索引这一事实有关,而实体框架中不支持这些索引。

作为对我的回答的支持,我构建了一个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")));

  4. 没有创建索引,但应用程序也没有崩溃。我可以尝试对此进行排列,但我的例子似乎遵循实体框架的惯例:Official Fluent Documentation