我们在一个项目中使用 BreezeJS。这是一个很棒的工具,感谢您创建它!
我有一个具有两列主键的表。此表上还有一个标识列,它不是主键的一部分。
在您的客户端 JS(作为元数据解析的一部分)中,函数 parseCsdlSimpleProperty 在解析标识列后将 entityType 的 autoGeneratedKeyType 设置为“Identity”,即使它不是键的一部分:
var isPartOfKey = keyNamesOnServer != null && keyNamesOnServer.indexOf(csdlProperty.name) >= 0;
if (parentType.autoGeneratedKeyType == AutoGeneratedKeyType.None) {
if (isIdentityProperty(csdlProperty)) {
parentType.autoGeneratedKeyType = AutoGeneratedKeyType.Identity;
}
}
在将实体保存回数据库后,这会给我们带来问题。调用 saveChanges() 后返回的实体具有不正确的 KeyMapping,导致“密钥修复中的内部错误 - 无法找到实体”错误。
我已在本地副本中对其进行了更改,以检查此属性是否是主键的一部分:
var isPartOfKey = keyNamesOnServer != null && keyNamesOnServer.indexOf(csdlProperty.name) >= 0;
if (parentType.autoGeneratedKeyType == AutoGeneratedKeyType.None && isPartOfKey) {
if (isIdentityProperty(csdlProperty)) {
parentType.autoGeneratedKeyType = AutoGeneratedKeyType.Identity;
}
}
我认为这是一个有效的解决方法,因为在主键之外使用标识列是公认的做法,但如果我错了,请告诉我。
谢谢