2013-11-23 7 views
5

मुझे ऐसी समस्या का सामना करना पड़ रहा है जो शायद काफी आम है लेकिन मुझे इसका कोई समाधान नहीं मिल रहा है। समस्या तब होती है जब किसी उपयोगकर्ता के पास क्लाइंट पर कैश में इकाइयां होती हैं और कोई अन्य उपयोगकर्ता उन इकाइयों में से कुछ को हटा देता है (सर्वर पर)। जब पहला उपयोगकर्ता उसके डेटा को अपडेट करना चाहता है तो हटाए गए इकाइयों को कैश से हटाया नहीं जाता है। जब भी आप अपडेट करते हैं तो आप कैश को साफ़ करके इसे हल कर सकते हैं लेकिन फिर आप सभी गैर-सहेजे गए परिवर्तन भी खो देते हैं। क्या मुझे कुछ याद आ रही है?ब्रीज़: पूरे कैश को साफ़ किए बिना किसी अन्य उपयोगकर्ता द्वारा डेटाबेस से हटाए गए कैश से इकाइयों को निकालें?

उदाहरण:

मॉडल:

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); 
    } 
} 

चरण-दर-चरण परिदृश्य:

  1. साथ एक आदेश के लिए उपयोगकर्ता A प्रश्नों अपने संबंधित आदेश।
  2. आदेश और ऑर्डर विवरण तब कैश में रखा जाता है।
  3. उपयोगकर्ता बी एक आदेश हटा देता है और सर्वर में परिवर्तनों को बचाता है।
  4. उपयोगकर्ता ऑर्डर के लिए नवीनतम अपडेट प्राप्त करने के लिए एक प्रश्न।
  5. जब क्वेरी हटा दी गई ऑर्डर करें अभी भी वहां है।

हवा-डॉक्स में, शीर्षक के अंतर्गत "कैश समाशोधन के बारे में महत्वपूर्ण चेतावनियां", वहाँ एक समाधान है कि क्वेरी से कैश और परिणाम की तुलना द्वारा कैश्ड संस्थाओं दूर करता है और परिणाम में लापता संस्थाओं detaches है। http://www.breezejs.com/documentation/entitymanager-and-caching लेकिन यह इस मामले में काम नहीं करता है। मुझे लगता है कि इसे इस तथ्य से करना है कि ऑर्डर विवरण से संबंधित है और यह सफलता-कॉलबैक को पारित होने से पहले कैश से "उठाया गया" है।

सभी मदद की सराहना की जाती है!

+0

इसे आज़माएं: http: //blogs.msdn.com/b/diego/archive/2012/04/01/tips-to-avoid-deadlocks-in-entity-framework-applications.aspx। –

उत्तर

3

आप जिस समस्या का सामना कर रहे हैं वह ब्रीज़ के साथ नहीं है, लेकिन सामान्य रूप से डिज़ाइन के साथ है।

  1. उपयोग SignalR, अपने वेब अनुप्रयोग है कि एक परिवर्तन हुआ है सूचित कैश से किसी भी हटा ली गई चीजों को अलग करने के लिए - वहाँ विकल्प है कि मन के लिए आते हैं के एक जोड़े हैं।

  2. डेटाबेस से इकाइयों को हटाने के बजाय संग्रहीत या हटाए गए ध्वज का उपयोग करें।

दोनों के पास उनके फायदे और नुकसान हैं।

SignalR साथ

आप सूचनाओं के लिए जगह में पाइप काम मिलता है और हटाने के नष्ट कर दिया संस्थाओं

manager.detachEntity(entityToDetach); 

कारण आप को हटाने के बजाय अलग होता है चारों ओर एक विशिष्ट कार्य प्रवाह की स्थापना करने की आवश्यकता होगी क्योंकि आप इसे सेट करता है, तो हटाए जाने के बाद आपके ब्रीज़ इकाई प्रबंधक अभी भी सोचते हैं कि आपको डेटाबेस में उस परिवर्तन को जारी रखने की आवश्यकता है।

आप तो एक ध्वज का उपयोग करते हैं तो आप बस संस्थाओं के रूप में नष्ट या संग्रहीत चिह्नित किये जाते हैं अनदेखी करने के लिए अपने व्यापार तर्क सेट कर सकते हैं और जब आप डीबी क्वेरी यह है कि संस्था के लिए परिवर्तन लौट सकते हैं और यह

myEntity().archived(true); 
दिखाना बंद कर देंगे

यहां समस्या यह होगी कि यदि आपकी इकाई आपकी क्वेरी से मेल नहीं खाती है तो यह ग्राहक को यह जानने के लिए अद्यतन इकाई वापस नहीं लौटाएगी कि यह संग्रहीत या हटा दिया गया था। दूसरी चेतावनी यह है कि आपके पास अपने डेटाबेस में चारों ओर की जानकारी होगी जो अब सक्रिय नहीं है।

आपके पास किस प्रकार के आवेदन और आवश्यकताएं हैं, इस पर निर्भर करते हुए आपको इन विकल्पों में से एक बनाना चाहिए, या किसी अन्य के साथ आना चाहिए। उम्मीद है की वो मदद करदे।

संबंधित मुद्दे