使用Breeze.Persistence.EFCore执行INSERT操作时遇主键NULL错误
Breeze.Persistence.EFCore 保存Guid主键新实体时出现NULL插入错误的解决方法
问题现象
保存新实体时触发数据库错误:
无法将值NULL插入列'id',表'dbo.Clients';列不允许空值。INSERT失败。
环境与前置信息
- 问题仅出现在新实体保存场景,UPDATE、DELETE操作正常
- 实体Id为Guid数据类型,已显式标记
[Key]特性 - 客户端breeze.js已自动生成Id,且确认该值已成功传输到服务器
排查过程
验证服务器端接收的实体Id存在有效值,但调试Breeze.Persistence.EFCore的HandleAdded()方法(含// HACK注释)时发现:IsTemporary属性被设为true,但RealValue仍为null,推测是Breeze与EF Core的配置兼容性问题。
无效尝试
- 升级Breeze.Persistence.EFCore至v7.2.1稳定版,问题未解决
- 尝试在保存前手动设置Id,重写
BeforeEntitySave()方法赋值仍失败
最终解决方案
修改客户端breeze.js配置,将目标实体的AutoGeneratedKeyType设为None,阻止客户端自动生成Id,改为在服务器端通过BeforeEntitySave()方法生成并设置Id。代码示例:
import * as breeze from 'breeze-client'; let manager = new breeze.EntityManager(this.serviceUrl); manager.fetchMetadata().then(() => { register(manager.metadataStore); }); function extend(store: breeze.MetadataStore) { store.getAsEntityType("Client") .setProperties({ autoGeneratedKeyType: breeze.AutoGeneratedKeyType.None }); }
设置完成后,新实体保存时不再出现Id为NULL的插入错误,问题解决。后续计划在GitHub提交相关issue反馈该问题。
内容的提问来源于stack exchange,提问作者Nozim Turakulov
相关产品推荐
相关产品推荐

