2010-02-18 12 views
5

मैं दो वर्ग NiceCustomer & RoughCustomer का उपयोग कर रहा हूं जो इंटरफेस ICustomer को लागू करता है।nhibernate में एक इंटरफ़ेस कैसे मैप करें?

ICustomer में चार गुण हैं। वे हैं:

  1. Property Id() As Integer
  2. Property Name() As String
  3. Property IsNiceCustomer() As Boolean
  4. ReadOnly Property AddressFullText() As String

मैं इंटरफ़ेस ICustomer मैप करने के लिए कैसे, डेटाबेस के लिए पता नहीं है।

मुझे आंतरिक अपवाद में इस तरह की एक त्रुटि मिलती है।

एक संघ एक तुच्छ वर्ग को दर्शाता है: ICustomer

मैं धाराप्रवाह और NHibernate उपयोग कर रहा हूँ।

+0

मुझे नहीं लगता कि आपको किसी भी इंटरफ़ेस को मैप करने की आवश्यकता है .. क्या आप अपनी मैपिंग फाइलें पोस्ट कर सकते हैं? धन्यवाद –

+0

महेश का जवाब देने के लिए धन्यवाद। लेकिन केविन ने कहा था कि हम निबर्ननेट में एक इंटरफेस को मैप नहीं कर सकते हैं। मैंने इंटरफ़ेस को बेस क्लास में बदल दिया है। – Josh

उत्तर

0

निबर्ननेट में एक इंटरफ़ेस को मैप करना संभव नहीं है। यदि आपका लक्ष्य दोनों प्रकार के ग्राहकों को पुनर्प्राप्त करने के लिए एक सामान्य प्रकार का उपयोग करके क्वेरी करने में सक्षम होना है, तो आप एक पॉलिमॉर्फिक क्वेरी का उपयोग कर सकते हैं। बस दोनों कक्षाएं इंटरफ़ेस को कार्यान्वित करती हैं और कक्षाओं को सामान्य रूप से मैप करती हैं।

https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html (अनुभाग 11,6)

+0

मैंने पॉलिमॉर्फिक क्वेरी भी कोशिश की है लेकिन यह काम नहीं करता है। अभी भी उस अप्रत्याशित इंटरफ़ेस ग्राहक के साथ परेशानी थी। तो अब इसे एक बेस क्लास बनाया गया है जो ठीक काम करता है। केविन बहुत धन्यवाद। – Josh

+0

"नामित लगातार कक्षा के लिए यह एक इंटरफ़ेस होने के लिए पूरी तरह स्वीकार्य है। फिर आप तत्व का उपयोग करके उस इंटरफ़ेस के कार्यान्वयन कक्षाओं की घोषणा करेंगे।" http://knol.google.com/k/fabio-maulo/nhibernate-chapter-5-basic-o-r-mapping/1nr4enxv3dpeq/8# – Neal

+3

इस उत्तर में लिंक टूटा हुआ है। कृपया लिंक को अपडेट करें या अपने उत्तर में अधिक जानकारी जोड़ें। –

0

आप कैसे जानना चाहते हैं: इस संदर्भ देखते हैं? और

<import class="name.space.ICustomer, Customers" /> 

आप मानदंड उपयोग कर रहे हैं तो आप सिर्फ ICustomer के लिए क्वेरी करने के लिए सक्षम होना चाहिए यह दोनों ग्राहक वापसी करेंगे: आप HQL उपयोग कर रहे हैं तो आप इस लाइन के साथ एक HBM फ़ाइल के साथ इंटरफेस के नाम स्थान आयात करने की आवश्यकता प्रकार के।

आप एक वर्ग उस पर एक ग्राहक है कि मानचित्रण कर रहे हैं या तो एक HasMany, HasManyToMany या संदर्भ तो आप सामान्य रूप उपयोग करने की आवश्यकता के माध्यम से:

References<NiceCustomer>(f=>f.Customer) 

आप इसे किसी से निपटने के लिए चाहते हैं, आप उन्हें उपवर्गों बनाने की आवश्यकता होगी

Subclassmap<NiceCustomer> 

जो मामले में मुझे लगता है कि आप आधार वर्ग ग्राहक की जरूरत है और का उपयोग करें कि बाहरी कक्षा में सामान्य प्रकार पैरामीटर के लिए होगी:

References<Customer>(f=>f.Customer) 

भले ही, आपको इसका सामना करने के लिए अपने डोमेन मॉडल को नहीं बदला जाना चाहिए, फिर भी बाहरी कक्षा में आईसी कस्टमर होना चाहिए।

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

3

आप कर सकते हैं NHibernate में इंटरफेस को सीधे नक्शा, विन्यास चरण के दौरान एक EmptyInterceptor प्लग इन करके।इस इंटरसेप्टर का काम आपके मैपिंग फाइलों में परिभाषित इंटरफेस को कार्यान्वयन प्रदान करना होगा।

public class ProxyInterceptor : EmptyInterceptor 
{ 
    public ProxyInterceptor(ITypeHandler typeHandler) { 
     // TypeHandler is a custom class that defines all Interface/Poco relationships 
     // Should be written to match your system 
    } 

    // Swaps Interfaces for Implementations 
    public override object Instantiate(string clazz, EntityMode entityMode, object id) 
    { 
     var handler = TypeHandler.GetByInterface(clazz); 
     if (handler == null || !handler.Interface.IsInterface) return base.Instantiate(clazz, entityMode, id); 
     var poco = handler.Poco; 
     if (poco == null) return base.Instantiate(clazz, entityMode, id); 

     // Return Poco for Interface 
     var instance = FormatterServices.GetUninitializedObject(poco); 
     SessionFactory.GetClassMetadata(clazz).SetIdentifier(instance, id, entityMode); 

     return instance; 
    } 

} 

इसके बाद, सभी रिश्तों और मैपिंग को इंटरफेस के रूप में परिभाषित किया जा सकता है।

public Parent : IParent { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public IChild Child { get; set; } 
} 

public Child : IChild { 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class ParentMap : ClassMap<IParent> 
{ 
    public ParentMap() 
    { 
     Id(x => x.ID).GeneratedBy.Identity().UnsavedValue(0); 
     Map(x => x.Name) 
    } 
} 

... 

तकनीक के इस प्रकार के महान यदि आप अपने ORM का सच decoupling हासिल करना चाहते हैं, सभी विन्यास रखने है/एक अलग परियोजना में मैपिंग और केवल संदर्भित इंटरफेस। तब आपकी डोमेन परत को ओआरएम के साथ प्रदूषित नहीं किया जा रहा है, और यदि आपको आवश्यकता हो तो आप इसे बाद के चरण में बदल सकते हैं।

+0

क्या आप कॉन्फ़िगरेशन में प्रॉक्सीइंटरसेप्टर का उपयोग करने का एक उदाहरण जोड़ सकते हैं? मैं अभी फ्लुएंट निबर्ननेट का उपयोग शुरू कर रहा हूं और प्रॉक्सी निर्दिष्ट करने के लिए कॉन्फ़िगरेशन भाग के साथ पर्याप्त परिचित नहीं हूं ... –

+0

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

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