2010-06-03 16 views
8

में मानचित्रण दृश्यों के लिए रणनीतियां ऐसा लगता है कि एनएचबीरनेट को मैपिंग के हिस्से के रूप में निर्दिष्ट एक आईडी टैग होना चाहिए। यह विचारों के लिए एक समस्या प्रस्तुत करता है क्योंकि अधिकांश समय (मेरे अनुभव में) एक दृश्य में आईडी नहीं होगी। मैंने निबर्ननेट में पहले विचारों को मैप किया है, लेकिन जिस तरह से मैंने ऐसा किया वह मेरे लिए गन्दा लग रहा था।एनएचबीरनेट

यहां दूषित उदाहरण है कि मैं वर्तमान में इसे कैसे कर रहा हूं।

मानचित्रण

<class name="ProductView" table="viewProduct" mutable="false" > 
    <id name="Id" type="Guid" > 
     <generator class="guid.comb" /> 
    </id> 
    <property name="Name" /> 
<!-- more properties --> 
    </class> 

देखें एसक्यूएल

Select NewID() as Id, ProductName as Name, --More columns 
From Product 

कक्षा

public class ProductView 
{ 
    public virtual Id {get; set;} 
    public virtual Name {get; set;} 
} 

मैं पी के लिए एक आईडी की जरूरत नहीं है roduct या कुछ विचारों के मामले में मेरे पास दृश्य के लिए आईडी नहीं हो सकती है, इस पर निर्भर करता है कि मेरे पास

पर नियंत्रण है या नहीं, क्या निबर्ननेट में ऑब्जेक्ट्स पर मैपिंग दृश्यों का बेहतर तरीका है?

संपादित
जवाब अब तक

मानचित्रण

<class name="ProductView" table="viewProduct" mutable="false" > 
    <id name="Id" type="Guid" /> 
    <property name="Name" /> 
    <!-- more properties --> 
    </class> 

कक्षा

public class ProductView 
    { 
     public virtual Name {get; set;} 
     //more properties 
    } 

एसक्यूएल देखें
क्या मुझे अभी भी नया आईडी() चाहिए?

Select NewID() as Id, ProductName as Name, --More columns 
From Product 

उत्तर

5

आप इसे एक संपत्ति के लिए आईडी मैपिंग नहीं और जनरेटर को छोड़ते हुए से सिर्फ एक छोटा सा क्लीनर बना सकते हैं:

<id column="Id" type="guid"/> 

इस तरह, आप डेटा स्तर में समस्या रखने के लिए, कार्यान्वयन विस्तार लीक बिना आपके डोमेन पर

+0

क्या इसका मतलब यह है कि मैं टीआईएसक्यूएल चयन से न्यूआईडी() को हटा सकता हूं क्योंकि यह केवल आईडी –

+2

नंबर पर निबर्ननेट की आवश्यकता को पूरा करने के लिए है, इसका मतलब है कि आपकी कक्षा को आईडी संपत्ति की आवश्यकता नहीं है। –

+0

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

2

जहाँ तक मुझे पता है, NHibernate या तो एक आईडी या एक composite-id परिभाषा के बाद से यह व्यवस्था है जिसके द्वारा यह विशिष्ट किसी दिए गए रिकॉर्ड की पहचान करता है की आवश्यकता होगी। यदि कॉलम का कोई संयोजन नहीं है जो दृश्य में प्रत्येक पंक्ति के लिए एक कुंजी प्रदान करता है, तो मुझे लगता है कि आप हैकी वर्कअराउंड से फंस गए हैं।

+2

मेरी इच्छा है कि जब आप एक वर्ग को 'mutable = false' के रूप में चिह्नित करते हैं तो एक आईडी के लिए स्पष्ट आवश्यकता दूर हो जाती है। सुनिश्चित नहीं है कि यह व्यावहारिक है लेकिन इस तरह के परिदृश्य को संभालने में आसान बनाता है, इमो। –