2010-01-08 10 views
7

this question में मैंने NHibernate सत्र जीवनकाल के बारे में पूछा। मैं डेस्कटॉप एप्लिकेशन का उपयोग कर रहा हूं, लेकिन क्लाइंट/सर्वर अलगाव के साथ, तो निष्कर्ष यह है कि मैं एक सर्वर प्रति सर्वर अनुरोध का उपयोग करूंगा, क्योंकि सर्वर की तरफ जहां सभी एनएचबेर्नेट जादू होता है।सेवाओं का उपयोग कर NHibernate सत्र जीवनकाल को कैसे संभालें?

मेरी समस्या यह है कि इसे कैसे संभालें। सत्र में समय-समय पर बंद होने पर संदर्भित डेटा लोड होने के साथ मेरे पास problems before है। समस्या यह है कि मैं जब डिबगिंग मेरी संदर्भित वर्गों पर निम्न देखें है - इसलिए संदर्भित डाटा अभी तक भरी हुई है नहीं:

आधार {NHibernate.HibernateException} = { "[MyNamespace.Foo # 14] आरंभ किया जा रहा -failed lazily की भूमिका एक संग्रह प्रारंभ करने में: MyNamespace.Foo.Bars, कोई सत्र या सत्र बंद किया गया "}

मैं क्या समझ भले ही मैं लेन-देन के लिए प्रतिबद्ध यह सब लोड नहीं करता है से। तो मैंने सीखा है कि मुझे थोड़ी देर के लिए अपना सत्र खोलने की जरूरत है, लेकिन कितनी देर तक?

मेरा प्रश्न मूल रूप से है यदि मैं जीवन भर सही तरीके से संभालना चाहता हूं, या मुझे सही रास्ते पर क्या बदलना चाहिए। ईमानदारी से मैं नहीं देख सकता कि यह कैसे गलत हो सकता है, इसलिए मुझे वास्तव में क्या पसंद आएगा यह सुनिश्चित करने के लिए एक फ़ंक्शन कॉल है कि संदर्भित डेटा प्राप्त किया जाता है। मैं आलसी लोडिंग का उपयोग कर रहा हूं, इसलिए मैंने सोचा कि वे तुरंत लोड हो जाएंगे ..?

वर्तमान वास्तुकला: लेनदेन करने वाले "सेवा व्यवहार" वर्ग का उपयोग करना। यह IDisposable है, इसलिए सेवा स्वयं इसे चारों ओर एक उपयोग-खंड का उपयोग कर। NHibernateSessionFactory एक स्थिर कारखाना प्रदान करता है जिसे इसलिए पुन: उपयोग किया जाएगा।

// This is the service - the function called "directly" through my WCF service. 
public IList<Foo> SearchForFoo(string searchString) 
{ 
    using (var serviceBehavior = new FooServiceBehavior(new NhibernateSessionFactory())) 
    { 
     return serviceBehavior.SearchForFoo(searchString);  
    }       
} 

public class FooServiceBehavior : IDisposable 
{ 
    private readonly ISession _session; 

    public FooServiceBehavior(INhibernateSessionFactory sessionFactory) 
    { 
     _session = sessionFactory.OpenSession();     
    } 

    public void Dispose() 
    { 
     _session.Dispose(); 
    } 

    public IList<Foo> SearchForFoo(string searchString) 
    {   
     using (var tx = _session.BeginTransaction()) 
     { 
      var result = _session.CreateQuery("from Foo where Name=:name").SetString("name", searchString).List<Name>(); 
      tx.Commit(); 
      return result; 
     } 
    } 

उत्तर

5

यह पता चला मैं सब के बाद आलसी लोड हो रहा है कर रहा हूँ। मैं निम्नलिखित मानचित्रण था:

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Not.LazyLoad(); 
     Id(c => c.Id).GeneratedBy.HiLo("1"); 
     Map(c => c.Name).Not.Nullable().Length(100); 
     HasMany(x => x.Bars).Cascade.All(); 
    } 
} 

मैं Not.LazyLoad() विकलांग आलसी लोड हो रहा है मान लिया, लेकिन जाहिरा तौर पर संदर्भित वस्तुओं के लिए नहीं। मैंने संदर्भ पर आलसी लोडिंग जोड़ा, और ऐसा लगता है कि इस मुद्दे को ठीक किया गया है।

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Not.LazyLoad(); 
     Id(c => c.Id).GeneratedBy.HiLo("1"); 
     Map(c => c.Name).Not.Nullable().Length(100); 
     HasMany(x => x.Bars).Not.LazyLoad(); // <---------- 
    } 
} 

आपके समय के लिए धन्यवाद, और मुझे आपकी राय देखने में खुशी होगी कि मेरी दी गई संरचना उचित है या नहीं।

-1

यदि मैपिंग उद्देश्यों के लिए एक्सएमएल फाइलों का उपयोग किया जाता है, तो हम बैग के लिए आलसी = झूठी सेट कर सकते हैं।

+0

एक्सएमएल फाइलों का उपयोग मानचित्रण के लिए नहीं किया जाता है - जैसा कि आप उदाहरण कोड में देख सकते हैं। मैपिंग के लिए फ्लुएंट का उपयोग कर रहा हूँ। – stiank81

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