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

9

好的,问题已经很清楚了。使用Entity Framework 6.1 fluent API创建空间索引是否可行?

2个回答

7
我所知道的唯一方法是通过“自定义”迁移来完成。在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的“正常”迁移模式,所以并不算太糟糕。


这也是我为EF 6.2找到的最佳选项。如果您将普通的[Index]用作DbGeographyData Annotations,则在更新数据库时会出现以下错误:Column 'Area' in table 'dbo.YourTable' is of a type that is invalid for use as a key column in an index or statistics. - Ogglas

1
简短回答-不是的。我在博客中看到过这个相关的提及,但没有找到具体的实现示例。似乎与空间索引是过滤索引有关,而Entity Framework不支持过滤索引。
作为我的答案支持,我使用最新版本的Entity Framework(6.1)构建了一个POC控制台应用程序。我采取了以下步骤:
1.创建一个具有DbGeography类型属性的模型 2.启用自动迁移 3.运行Update-Database -verbose,确保迁移添加了索引。索引使用了以下内容:
modelBuilder.Entity().Property(t => t.Coordinates).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("ix_locationentity_coordinates")));
没有创建索引,但应用程序也没有崩溃。我可以尝试对此进行排列组合,但我的示例似乎遵循实体框架的惯例: 官方流畅文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接