Im phải đối mặt với một vấn đề mà có lẽ là khá phổ biến nhưng tôi không thể tìm thấy bất kỳ giải pháp cho nó. Sự cố xảy ra khi người dùng có các thực thể trong bộ nhớ cache trên máy khách và một người dùng khác loại bỏ một số thực thể đó (trên máy chủ). Khi người dùng đầu tiên muốn cập nhật dữ liệu của mình, các thực thể đã loại bỏ sẽ không bị xóa khỏi bộ nhớ cache. Bạn có thể giải quyết nó bằng cách xóa bộ nhớ cache mỗi khi bạn cập nhật nhưng sau đó bạn cũng mất tất cả các thay đổi không được lưu. Tôi có thiếu điều gì đó hiển nhiên không?Làn gió: Xóa các thực thể khỏi bộ nhớ cache bị người dùng khác xóa khỏi cơ sở dữ liệu mà không xóa toàn bộ bộ nhớ cache?
Ví dụ:
mẫu:
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; }
}
Khách hàng mã:
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);
}
}
Step-by-step kịch bản:
- dùng A truy vấn cho một đơn đặt hàng với mình lệnh chi tiết tương ứng.
- Đơn đặt hàng và đơn đặt hàng sau đó được đặt trong bộ nhớ cache.
- Người dùng B loại bỏ một đơn đặt hàng và lưu các thay đổi cho máy chủ.
- Người dùng Truy vấn để nhận các bản cập nhật mới nhất cho đơn hàng.
- Khi truy vấn trả về đơn hàng đã bị xóa vẫn còn đó.
Trong các tài liệu dễ dàng, dưới tiêu đề "Lưu ý quan trọng về xóa bộ nhớ cache", có giải pháp xóa các thực thể được lưu trong bộ nhớ cache bằng cách so sánh bộ nhớ cache và kết quả từ truy vấn và tách các thực thể bị thiếu trong kết quả. http://www.breezejs.com/documentation/entitymanager-and-caching Nhưng điều đó không hoạt động trong trường hợp này. Tôi đoán nó đã làm với thực tế là orderdetails có liên quan đến thứ tự và rằng nó được "nhặt" từ bộ nhớ cache trước khi nó được thông qua để gọi lại thành công.
Tất cả trợ giúp đều được đánh giá cao!
Hãy thử cách này: http: //blogs.msdn.com/b/diego/archive/2012/04/01/tips-to-avoid-deadlocks-in-entity-framework-applications.aspx. –