このエラーは常に報告されていますが、アプリの動作は意図したとおりであるため、デバッグに苦労しています。それが何を意味し、どのようにそのソースをデバッグすることができるかについてのポインタをいただければ幸いです。
あいまいで申し訳ありませんが、望ましい結果が得られているため、他にどのような情報を提供すればよいかわかりません。
アップデート
この問題の再現を作成し、コードを問題に集中させようとしました。データベースが正しく更新されていても、エラーは一貫してスローされます。コードには 1 つの saveChanges があり、Breeze Todo サンプルの dataservice.js の保存機能を使用します。SaveOptions.allowConcurrentSaves は false です。
それを説明するのに完全に途方に暮れ、EFコードを調べて、明らかな間違いを犯しているかどうかを確認しましたが、それを見ることができません。WebAPI の SaveChanges メソッドに送信されたバンドルも正しいように見えます (ID などが正しく取り込まれています)。
https://github.com/DazWilkin/BreezeJS.ScoreIssue
2月6日更新
この問題は、ウェイドの役立つ回答によって未解決のままです。残念ながら、何が間違っているのか、またはこれがバグであることを理解できない限り、このプロジェクトでの Breeze の使用を放棄し、くだらない単純な古い AJAX 呼び出しに戻る必要があります。
この問題は、変更を保存するときにゼロの GUID を返すサーバーを中心に展開しているようです。メソッドはエラーを返しません。これが私のエンティティ モデルのバグであることを知ってわくわくしますが、疑わしいと思います。
失敗は次のとおりです。
微風.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}
しかし、(サーバーによる Web API 呼び出しから返される) tempValue の値は間違っています:
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"
}
}
}
],
当然のことながら、breeze.debug.js: 10494 saveBundleStringified で作成された AJAX 呼び出しによってサーバーに送信された値は正しく、サーバーによって受信された値と同じです (再現しませんが、再現することを保証します)。
そして、私のコードから、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の(一時)値と一致します...
私は何を間違っていますか?? 髪の毛があったら、引きちぎるよ!