我们使用BreezeJS作为项目。这是一个非常棒的工具,感谢您创建它!在元数据解析中使用不正确的autoGeneratedKeyType Breeze
我有一个有两列主键的表。在此表上还有一个不属于主键的标识列。
在您的客户端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;
}
}
我认为这是一个有效的修复,因为它是公认的做法是使用标识列主键之外,但请告诉我,如果我错了。
感谢