EF Core 2.0.1 PostgreSQL Database First Scaffolding报错及警告求助
我来帮你逐个解决遇到的EF Core Scaffold问题:
核心错误:
The collection argument 'propertyNames' must contain at least one element 这个错误的根因很清晰:你的PostgreSQL数据库中存在不包含任何列的空索引。EF Core在生成实体模型时,调用HasIndex方法必须传入至少一个列名,遇到空索引就会触发这个参数校验错误。
解决步骤:
- 连接到你的PostgreSQL数据库,执行以下SQL查询找出所有空索引:
SELECT schemaname, tablename, indexname FROM pg_indexes JOIN pg_class ON pg_indexes.indexname = pg_class.relname WHERE NOT EXISTS ( SELECT 1 FROM pg_index WHERE pg_index.indexrelid = pg_class.oid AND array_length(pg_index.indkey, 1) > 0 ) - 针对查询结果中的空索引:
- 如果是无用的冗余索引,直接删除它:
DROP INDEX IF EXISTS schemaname.indexname; - 如果这个索引是必要的,给它添加至少一列作为索引列:
CREATE INDEX indexname ON schemaname.tablename (column_name);
- 如果是无用的冗余索引,直接删除它:
- 重新运行你的Scaffold命令:
Scaffold-DbContext "Host=localhost;Database=xxxx;Username=xxxx;Password=xxx" Npgsql.EntityFrameworkCore.PostgreSQL
警告问题处理
警告1:Sequence with datatype integer which isn't the expected bigint
这个警告是Npgsql EF Core提供程序的默认行为:它期望数据库序列的类型是bigint,但你的库中存在integer类型的序列。
解决选项:
- 忽略警告:这个警告只是提示类型不匹配,不会影响程序功能,如果不需要修改现有数据库,可以直接忽略;
- 修改序列类型:把对应的integer序列改为bigint,执行SQL:
ALTER SEQUENCE your_sequence_name AS bigint; - 手动配置映射:在生成的DbContext中,显式指定实体键的序列类型,比如:
modelBuilder.Entity<YourTargetEntity>() .Property(e => e.Id) .UseNpgsqlIdentityColumn(identityType: typeof(int));
警告2:列'tiger.street_type_lookup.is_hw'通常会映射为非可空bool属性,但它有默认约束,因此被映射为可空bool属性
这是EF Core的映射逻辑导致的:虽然该列是非空的,但因为带有默认约束(插入时可以不提供值,数据库自动填充默认值),EF Core会将其映射为可空bool?类型,避免插入时出现值冲突。
解决选项:
- 手动修改实体映射:如果你希望强制映射为非可空
bool,可以修改生成的实体类和DbContext配置:- 把实体类中的属性从
public bool? IsHw { get; set; }改为public bool IsHw { get; set; } - 在DbContext的
OnModelCreating方法中添加配置:modelBuilder.Entity<StreetTypeLookup>() .Property(e => e.IsHw) .IsRequired() .HasDefaultValue(false); // 替换成你数据库中该列的实际默认值
- 把实体类中的属性从
- 接受默认映射:如果不影响业务逻辑,也可以直接忽略这个警告。
内容的提问来源于stack exchange,提问作者user57029
相关产品推荐
相关产品推荐

