可以使用NPGSQL在CodeFirst EntityFramework中指定JSONB GIN索引吗?

时间:2019-02-10 17:08:10

标签: postgresql entity-framework npgsql

我在EFCore项目的EF代码第一个对象上有一些JSONB列。我想为存储在JSONB属性/列中的那些强类型对象内的属性设置一些GIN索引。
这可能吗? (当前使用的是postgres:最新图片)

谢谢。

3 个答案:

答案 0 :(得分:2)

由于.ForNpgsqlHasMethod("gin")已过时,因此在EF Core 3.1中,您可以使用以下方法:

metaBuilder
    .HasIndex(x => x.DocumentNumber)
    .HasMethod("gin")
    .HasOperators("gin_trgm_ops");

,您的迁移将如下所示:

migrationBuilder.CreateIndex(
    name: "IX_DocumentContentMeta_DocumentNumber",
    table: "DocumentContentMeta",
    column: "DocumentNumber")
    .Annotation("Npgsql:IndexMethod", "gin")
    .Annotation("Npgsql:IndexOperators", new[] { "gin_trgm_ops" });

答案 1 :(得分:1)

没有通过Npgsql EF6提供程序设置GIN索引的特定方法。但是,您可以在迁移中使用原始SQL来手动设置它。

但是,正如@ hellokitty5685在另一个答案中所写,这在EF Core中是可能的。

答案 2 :(得分:1)

嗯,实际上你可以这样做

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Artist>()
       .HasIndex(a => new { a.Album })
       .ForNpgsqlHasMethod("gin");

    base.OnModelCreating(modelBuilder);
}

当您运行ef add migration时,生成的sql查询将类似于:

使用gin(“专辑”)在艺术家上创建索引ix_artist_album;

Npgsql中的文档:http://www.npgsql.org/efcore/modeling/indexes.html