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

uqcuzwp8  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(4)|浏览(124)

我在EFCore项目中的EF代码第一个对象上有一些JSONB列。我想建立一些GIN索引,以存储为JSONB属性/列的强类型对象中的属性。
这可能吗?(当前使用postgres:latest image)

  • 谢谢-谢谢
pxiryf3j

pxiryf3j1#

由于.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" });

0yycz8jy

0yycz8jy2#

其实你可以这样做

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

    base.OnModelCreating(modelBuilder);
}

字符串
当你运行ef add migration时,生成的sql查询将像这样:
CREATE INDEX ix_artist_album ON artist USING gin(“album”);
Npgsql中的文档:http://www.npgsql.org/efcore/modeling/indexes.html

zujrkrfu

zujrkrfu3#

第一步:创建索引

modelBuilder.Entity<MyAwesomeModel>()
    .HasIndex(f => f.stringToTriGram)
    .HasMethod("gin")
    .HasOperators("gin_trgm_ops");

字符串

第二步:开启TrigramExtension

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.HasPostgresExtension("pg_trgm");
}

egdjgwm8

egdjgwm84#

通过Npgsql EF 6提供程序设置GIN索引没有特定的方法。但是,您可以在迁移中使用原始SQL手动设置它。
然而,正如@hellokitty5685在另一个答案中所写的那样,这在EF Core中是可能的。

相关问题