2012-03-05 13 views
7

से मैं इस तरह एक आवेदन पलायन कर रहा हूँ:NHibernate को बेदखल करके प्रकार के बजाय उदाहरण

Vehicle v = null; 
using (ISession session = MyNHibernateSession()) 
{ 
    v = Vehicle.FindById(1); 
} 

using (ISession session = MyNHibernateSession()) 
{ 
    // somwwhere into these4 lines Vehicle comes Finded 
    DoSomething(); 
    DoSomething2(); 
    DoSomething3(); 
    DoSomething4(); 
    DoSomething5(); 
    DoSomething6(); 

    // if i do this i get an error "another object with the same id etc etc etc 
    session.Update(v); 
} 

मैं इस तरह कुछ करने के लिए wan't:

session.EvictAllByType(typeof(Vehicle)); 

यह संभव है? कैसे ?, धन्यवाद

+0

आप सत्र को साफ करने के लिए हमेशा 'session.Clear() 'कर सकते हैं। –

+0

session.clear() सभी सत्रित ऑब्जेक्ट्स को साफ़ करता है, मुझे केवल वाहन प्रकार ऑब्जेक्ट्स को साफ़ करने की आवश्यकता है, thanx – manuellt

उत्तर

0

आईएमएचओ मुझे नहीं लगता कि बेदखल आपके मामले में समाधान है क्योंकि वी दूसरे सत्र से संबंधित नहीं है (इसलिए यदि आप सभी वाहनों को बेदखल नहीं करते हैं)।

मेरे सुझाव दूसरे सत्र के लिए वी संलग्न करने के लिए है की तरह:

... 
using (ISession session = MyNHibernateSession()) 
{ 
    session.Lock(v, LockMode.None); 

    // somwwhere into these4 lines Vehicle comes Finded 
... 
+0

थैंक्स @ मार्था, मेरी ऑब्जेक्ट ने शायद अपना राज्य बदल दिया है और अपडेट/विलय करने की आवश्यकता है, मैं अपनी वस्तु के साथ चीजें करता हूं, तुरंत मैं बेदखल करता हूं मेरी ऑब्जेक्ट, क्योंकि अगली कोड को अन्य (गैर खान) वाहनों को फिर से पूछताछ करने के लिए अन्य (गैर खान) वाहनों की आवश्यकता होती है। – manuellt

7

यह सवाल पुराना हो सकता है, लेकिन मैं यहाँ समाप्त हो गया इसे कैसे करना के लिए खोज करते हुए। तो इस तरह मैंने इसे समाप्त कर दिया:

public static void EvictAll<T>(this ISession session, Predicate<T> predicate = null) 
    { 
     if (predicate == null) 
      predicate = x => true; 
     foreach (var entity in session.CachedEntities<T>().Where(predicate.Invoke).ToArray()) 
      session.Evict(entity); 
    } 

    public static IEnumerable<T> CachedEntities<T>(this ISession session) 
    { 
     var sessionImplementation = session.GetSessionImplementation(); 
     var entities = sessionImplementation.PersistenceContext.EntityEntries.Keys.OfType<T>(); 
     return entities; 
    } 
+0

+1 मैंने इसे आज लागू किया और यह आसान काम में आया :) यह सुनिश्चित नहीं था कि सटीक संदर्भ में वास्तव में कहां देखना है। – Lukazoid

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

  • कोई संबंधित समस्या नहीं^_^