.NET EF迁移报错‘no schema has been selected to create in’排查求助
统一Schema名称大小写
PostgreSQL默认对未加引号的标识符会自动转为小写存储,你代码中HasDefaultSchema用的是小写booksstore,但ToTable指定的是大小写混合的BooksStore,这可能导致EF生成的SQL与数据库实际schema不匹配。建议统一配置,若数据库中schema是大小写混合的名称,需用引号包裹:protected override void OnModelCreating(ModelBuilder builder) { builder.HasDefaultSchema("\"BooksStore\""); builder.Entity<BookEntity>().ToTable("Books", schema: "\"BooksStore\""); base.OnModelCreating(builder); }检查EF迁移脚本
执行Add-Migration InitialCreate生成迁移,查看迁移文件中的SQL语句,确认创建表的语句是否指向BooksStoreschema;也可执行Update-Database -Script生成完整SQL脚本,手动验证schema部分是否正确。验证连接的实际搜索路径
用连接账号登录PostgreSQL(如pgAdmin),执行SHOW search_path;,确认搜索路径包含BooksStore。若未生效,可手动设置用户默认搜索路径:ALTER ROLE postgres SET search_path TO "BooksStore", public;设置后重新连接数据库测试。
确认Schema实际存在
执行以下SQL查询数据库中的schema列表,确认BooksStore(注意大小写)已存在:SELECT schema_name FROM information_schema.schemata;若不存在,先创建schema:
CREATE SCHEMA "BooksStore";验证权限有效性
手动执行权限授予语句确保生效,然后尝试手动创建表验证:GRANT USAGE, CREATE ON SCHEMA "BooksStore" TO postgres; CREATE TABLE "BooksStore".test(id INT);若能成功创建表,说明权限无问题;若失败,需排查角色权限配置。
检查EF Core版本兼容性
确认使用的Npgsql.EntityFrameworkCore.PostgreSQL版本与EF Core版本匹配,旧版本可能存在schema支持bug,建议升级至最新稳定版。
内容的提问来源于stack exchange,提问作者MagicWheel

