3 つのキー フィールドを持つエンティティがあり、そのうちの 1 つは日付です (聞かないでください。他に明らかなキーがない要約ビューです)。
Breeze は、前述のエンティティへの変更を保存した後、サーバーからの応答を処理するときに、 「このキーは既に接続されています」というエラーをスローします。
変更を保存した後、 MergeEntityで問題が発生します。最初のルックアップがクライアントでエンティティを見つけられなかったようです。そのため、エンティティを再度追加しようとするとエラーが発生します。
MergeEntity の上部近くに、次の行があります...
var entityKey = EntityKey._fromRawEntity(node, entityType);
... entityKey._keyInGroup == "1535:::44::: 2013-02-28T11:00:00.000Z " を返します。JSON 日付文字列のように見える 3 番目のキー フィールドに注意してください。
その後、新しいエンティティが (誤って) 作成されると、その entityKey._keyInGroup == "1535:::44::: Fri Mar 01 2013 00:00:00 GMT+1300 (New Zealand Daylight Time) ". 3 番目のフィールドは、実際の JavaScript の日付のように見えます。
この行にヒットすると、最終的にエラーが発生します...
attachEntityCore(em, targetEntity, EntityState.Unchanged);
...「このキーは既にアタッチされています」というエラーが表示されます。これは、保存したばかりのエンティティが明らかにクライアント キャッシュに既に存在していたためです。
更新:これを機能させるための Breeze への私のハック...
1) _ fromRawEntity関数を変更して日付をチェックし、適切に変換して、実際のエンティティに対して後で生成される同じキー値を取得するようにしました。(このコードはupdateEntity関数からコピーされたものであるため、同じように動作するはずです)。
ctor._fromRawEntity = function (rawEntity, entityType) {
var keyValues = entityType.keyProperties.map(function (p) {
var val = rawEntity[p.nameOnServer];
if (p.dataType.isDate && val) {
if (!__isDate(val)) {
val = DataType.parseDateFromServer(val);
}
}
return val;
});
return new EntityKey(entityType, keyValues);
};
2) Breeze は変更を保存した後にエンティティを見つけましたが... Breeze がサーバーから返された値を使用してエンティティのプロパティを更新しようとすると、エラーが発生しました。これは、プロパティ値が変更されたかどうかを確認していたdefaultPropertyInterceptor関数の問題が原因であると思われます...
// exit if no change
if (newValue === oldValue) {
return;
}
日付を比較すると、これは常に false を返すため、この行を次のようにハックしました。
if (newValue === oldValue || (dataType && dataType.isDate && newValue && oldValue && newValue.valueOf() === oldValue.valueOf())) {
return;
}
私の最初のテストでは、すべてが機能しているように見えますが、そよ風に精通している人々からの考えを大いに歓迎します:)
更新:おそらく最後のスニペットは、より風通しの良いものになるでしょう...
// exit if no change
var comparable = dataType && getComparableFn(dataType);
if (newValue === oldValue || (comparable && comparable(newValue) === comparable(oldValue))) {
return;
}
...ただし、すべてのプロパティ セットで実行されていることを考えると、もう少しコードが追加されます。