私はおそらくかなり一般的な問題に直面していますが、私はそれに対する解決策を見つけることができません。 問題は、ユーザーがクライアント上のキャッシュにエンティティを持ち、別のユーザーが(サーバー上の)エンティティの一部を削除した場合に発生します。第1のユーザがそのデータを更新したいとき、除去されたエンティティはキャッシュから除去されない。更新するたびにキャッシュをクリアすることで解決できますが、保存されていない変更もすべて失われます。 明白なものがありませんか?Breeze:キャッシュ全体をクリアせずに、別のユーザーがデータベースから削除したエンティティをキャッシュから削除しますか?
例:
モデル:
public class Order
{
[Key]
public int Id { get; set; }
public ICollection<OrderDetail> OrderDetails { get; set; }
}
public class OrderDetail
{
[Key]
public int Id { get; set; }
[ForeignKey("Order")]
public int Order_Id { get; set; }
public virtual Order Order { get; set; }
}
クライアントコード:
function getOrder(orderId, orderObservable) {
var query = EntityQuery.from("Orders")
.where("orderId", "==", orderId)
.expand("orderDetails");
return manager.executeQuery(query).then(querySucceeded).fail(queryFailed);
function querySucceeded(data) {
var order = data.results[0];
// NOTE: the removed orderdetail is still there 'order.orderDetails'
orderObservable(order);
}
}
ステップバイステップシナリオ:
- ユーザAの問合せその付き注文の対応する注文詳細。
- 注文と発注明細はキャッシュに入れられます。
- ユーザーBはorderdetailを削除し、変更をサーバーに保存します。
- ユーザー注文の最新の更新を取得するためのクエリ。
- クエリが削除されたorderdetailを返すとき、まだそこにあります。
breeze-docsでは、「キャッシュのクリアに関する重要な注意事項」の下に、キャッシュとクエリの結果を比較してキャッシュされたエンティティを削除し、欠落したエンティティを結果から切り離すソリューションがあります。 http://www.breezejs.com/documentation/entitymanager-and-caching しかし、この場合は動作しません。私はorderdetailsがオーダーに関連しており、成功コールバックに渡される前にキャッシュから "ピックアップ"されているという事実と関係があると推測しています。
すべてのご協力ありがとうございます。
これを試してください:http://blogs.msdn.com/b/diego/archive/2012/04/01/tips-to-avoid-deadlocks-in-entity-framework-applications.aspx –