EF Core 8.0.1生成Postgres B-Tree索引报错,如何配置?
使用EF Core 8.0.1为PostgreSQL生成B-Tree索引时,执行迁移触发Postgres语法错误,错误日志如下:
2024-02-12T23:41:35.418441849Z 12.02.2024 23:41:35.418+00:00 [ERR] (1) Failed executing DbCommand ("12"ms) [Parameters=[""], CommandType='Text', CommandTimeout='30']"
""CREATE INDEX ix_recipes_cooking_level ON foods.recipes USING b-tree (cooking_level);" (ActionId:,RequestId:)
2024-02-12T23:41:35.441575197Z Unhandled exception. Npgsql.PostgresException (0x80004005): 42601: syntax error at or near "-"
2024-02-12T23:41:35.441631718Z
2024-02-12T23:41:35.441653635Z POSITION: 63
错误原因
PostgreSQL中B-Tree索引的合法关键字是btree(无连字符),但EF Core生成了带连字符的b-tree,导致语法解析失败。
解决方法
1. 单个索引手动指定类型
在实体配置中显式指定索引使用btree:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Recipe>() .HasIndex(r => r.CookingLevel) .HasMethod("btree"); }
2. 全局默认配置
若需全局统一设置PostgreSQL默认索引类型为btree,在DbContext的配置中添加:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql("你的数据库连接字符串", opt => opt.UseBTreeIndexByDefault()); }
3. 直接修改迁移文件
如果已经生成迁移文件,可直接修改其中的SQL语句,将b-tree替换为btree:
-- 修正前 CREATE INDEX ix_recipes_cooking_level ON foods.recipes USING b-tree (cooking_level); -- 修正后 CREATE INDEX ix_recipes_cooking_level ON foods.recipes USING btree (cooking_level);
内容的提问来源于stack exchange,提问作者Alex

