NFluentHibernate映射Guid主键报Identity类型需为整型错误
错误原因
Identity()主键生成策略的设计目标是对接数据库原生自增主键能力,这类自增主键在所有主流数据库中都仅支持整数类型(int、long、uint、ulong),框架启动映射校验时会强制检查主键类型,非整数类型会直接抛出你遇到的错误。- 代码中实体
DocumentDetails的主键Id定义为Guid类型,却配置了仅支持整数类型的Identity()生成策略,类型与生成策略完全不匹配,是报错的直接原因。
修复方法
根据业务场景二选一即可:
方案1:保留Guid主键
如果业务要求用Guid作为主键,把主键生成策略替换为Guid兼容的策略即可,常用选项:
GeneratedBy.GuidComb():应用侧生成连续Guid,能大幅降低数据库主键索引碎片,是Guid主键场景的首选配置GeneratedBy.Guid():由数据库侧生成Guid值
修改后的主键映射代码:
// 仅替换主键生成策略,其余映射逻辑保持不变 Id(x => x.Id).Column("Id").GeneratedBy.GuidComb();
注意:选择该方案时,数据库中
Id字段类型要对应设置为uniqueidentifier(SQL Server)/uuid(PostgreSQL)等Guid存储类型,不要给字段加自增属性。
方案2:保留Identity自增主键
如果业务上不需要Guid主键,想用数据库原生自增能力,直接把实体类的主键类型从Guid改成框架支持的整数类型即可,推荐优先用long避免后续数据量超过int上限:
修改后的实体主键定义:
// 替换原有的Guid类型Id定义 public virtual long Id { get; set; }
该场景下原有的GeneratedBy.Identity()映射配置不需要调整,数据库中Id字段设置为对应整数类型、开启自增属性即可。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

