2010-05-27 14 views
12

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

निर्माता टिप्पणियाँ:

एक आईडी है कि डोमेन वस्तु, या डेटाबेस में एक कॉलम में एक इसी संपत्ति नहीं है बनाएँ। यह मुख्य रूप से केवल पढ़ने के लिए उपयोग और/या विचारों के उपयोग के लिए है। एक "वृद्धि" जनरेटर के साथ एक int पहचान के लिए डिफ़ॉल्ट।

public class PersonMapping : ClassMap<Person> 
{ 
    public PersonMapping() 
    { 
     Table("person"); 
     ReadOnly(); 

     Id(); 
     Map(f => f.Name, "name"); 
    } 
} 

उत्तर

8

NHibernate को एक आईडी की आवश्यकता है। विधि दस्तावेज़ कहता है कि यह एक आईडी बनाता है जिसमें आपके डोमेन ऑब्जेक्ट में कोई संबंधित प्रॉपर्टी नहीं है - हालांकि डेटाबेस में अभी भी एक आईडी है।

यदि आपके पास पहचानकर्ता के रूप में चिह्नित करने के लिए आपकी तालिका में कोई फ़ील्ड नहीं है (अद्वितीय होना चाहिए ..) हो सकता है कि आप कुछ कॉलमों को पहचानने का प्रयास कर सकें जिन्हें एक समग्र आईडी के रूप में बनाया जा सकता है।

उदाहरण के लिए यह देखते हुए एक सरल लिंक तालिका जो की तरह

A | B 
----- 
1 | 2 
1 | 3 
2 | 2 

एक अन्य पूर्णांक के लिए कुछ पूर्णांक लिंक आप जब तक सब ए/बी संयोजन अद्वितीय हैं कम्पोजिट आईडी इस्तेमाल कर सकते हैं।

public PersonMapping() 
{ 
    [...] 
    CompositeId() 
     .KeyProperty(x => x.A) 
     .KeyProperty(x => x.B); 
    [...] 
} 
+0

क्या डीबी फ़ील्ड को पूरी तरह से अनदेखा करने का कोई तरीका है। आईडी (Guid.NewGuid) की तरह या इस तरह की smth? –

5

आप रिकॉर्ड्स को संस्थाओं के बजाय मूल्य वस्तुओं (गैर-प्रबंधित इकाइयों) के रूप में पुनर्प्राप्त कर सकते हैं।

"14.1.5। रिटर्निंग गैर-प्रबंधित संस्थाओं

यह देशी एसक्यूएल प्रश्नों का एक IResultTransformer लागू करने के लिए संभव है। उदाहरण के लिए वापस जाने के गैर-प्रबंधित संस्थाओं के लिए यह अनुमति दे।

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO))) 

यह क्वेरी निर्दिष्ट नहीं:

  • एसक्यूएल क्वेरी स्ट्रिंग
  • एक परिणाम के ट्रांसफार्मर

ऊपर क्वेरी CatDTO जो instantiated कर दिया गया है और उससे संबंधित गुण या खेतों में NAME और BIRTHNAME के मूल्यों इंजेक्शन की एक सूची वापस आ जाएगी। "

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