gpt4 book ai didi

breeze - "Internal Error in key fixup - unable to locate entity"错误但数据库按预期更新

转载 作者:行者123 更新时间:2023-12-01 08:34:17 25 4
gpt4 key购买 nike

我正在努力调试此错误,因为尽管一直报告该错误,但该应用的行为符合预期。希望得到有关其含义以及如何调试其源代码的指针。

抱歉含糊不清,但由于我得到了预期的结果,我不确定要提供哪些其他信息。

更新

我已对此问题进行了重现,并尝试将代码集中在该问题上。即使数据库已正确更新,也会始终引发错误。代码中有一个 saveChanges,它使用 Breeze Todo 示例中 dataservice.js 的保存功能。 SaveOptions.allowConcurrentSaves 为 false。

完全无法解释它,并查看了我的 EF 代码,看看我是否犯了一个明显的错误但看不到它。发送到 WebAPI SaveChanges 方法的包看起来也正确(正确填充了 ID 等)。

https://github.com/DazWilkin/BreezeJS.ScoreIssue

2 月 6 日更新

韦德的有用回答仍未解决该问题。不幸的是,除非我能理解我做错了什么或知道这是一个错误,否则我将不得不放弃在这个项目中使用 Breeze,并恢复到蹩脚的、普通的旧 AJAX 调用。

问题似乎围绕着服务器在保存更改时返回归零的 GUID。该方法不返回错误。得知这是我的实体模型中的一个错误,我会很高兴,但我对此表示怀疑。

这是失败的原因:

breeze.debug.js:11954

var ix = this._indexMap[tempValue];
if (ix === undefined) {
throw new Error("Internal Error in key fixup - unable to locate entity");
}

当代码到达这一点时,this._indexMap的值是正确的,是:

{"bcb6e670-00fc-469d-8531-5767f40bf3c1":0}

但是 tempValue 的值(由服务器从 Web API 调用返回)是错误的:

00000000-0000-0000-0000-000000000000

realValue 是正确的并且是:

1093b975-7686-4621-8336-77c38ed36de0

备份堆栈。以下是 AJAX 调用的结果,breeze.debug.js: 12574。看到从服务器/WebAPI 调用返回时 tempValue 归零。 realValue 是正确的。这就是数据库包含的内容。该行被添加到表中没有问题。

"KeyMappings": [
{
"$id": "4",
"$type": "Breeze.WebApi.KeyMapping, Breeze.WebApi",
"EntityTypeName": "...Score",
"TempValue": "51877f5b-811f-4260-bd5b-cf9965159597",
"RealValue": "92b73b8a-8b33-45cd-9822-ca7c0c5d5d9a"
},
{
"$id": "5",
"$type": "Breeze.WebApi.KeyMapping, Breeze.WebApi",
"EntityTypeName": "...PropertyValue",
"TempValue": "00000000-0000-0000-0000-000000000000",
"RealValue": "1093b975-7686-4621-8336-77c38ed36de0"
}

],

根据服务器端在 saveBundle 中收到的内容进行验证。请注意,服务器收到的两个实体的 ID 都具有有效的 GUID ID。

"entities": [
{
"ID": "51877f5b-811f-4260-bd5b-cf9965159597",
...
"entityAspect": {
"entityTypeName": "Score:...",
"entityState": "Added",
"originalValuesMap": {},
"autoGeneratedKey": {
"propertyName": "ID",
"autoGeneratedKeyType": "Identity"
}
}
},
{
"ID": "bcb6e670-00fc-469d-8531-5767f40bf3c1",
...
"entityAspect": {
"entityTypeName": "PropertyValue:...",
"entityState": "Added",
"originalValuesMap": {},
"autoGeneratedKey": {
"propertyName": "ID",
"autoGeneratedKeyType": "Identity"
}
}
}
],

不出所料,通过 AJAX 调用发送到服务器的值是在轻风中创建的:10494 saveBundleStringified 是正确的,并且与服务器接收到的值相同(不会重现,但我向您保证它们是) .

而且,根据我的代码,当调用 saveChanges 时,

manager.getChanges().length == 2
manager.getChanges()[0].ID() == "51877f5b-811f-4260-bd5b-cf9965159597" (Score)
manager.getChanges()[1].ID() == "bcb6e670-00fc-469d-8531-5767f40bf3c1" (PropertyValue)

并且,正如预期的那样,它们与服务器接收到的 saveChanges 期间实体 ID 的 (temp) 值匹配...

我做错了什么??如果我有头发,我会把它撕掉!

最佳答案

我已经解决了。

我的不一致应用 (!) 约定是使 setter 在代码优先类型上是内部/私有(private)的。我的说法前后不一致,因为在感觉我已经用尽所有可能性之后,我发现 PropertyValue 类型,即引发错误的类型,有一个内部集合。

删除这个并重建解决方案,问题就解决了!

所以:

public Guid ID { get; internal set; }

应该是:

public Guid ID { get; set; }

关于breeze - "Internal Error in key fixup - unable to locate entity"错误但数据库按预期更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com