2009-03-18 11 views
8

मेरे पास एक कक्षा है जिसे एनएचबीर्नेट का उपयोग करके तालिका में मैप किया गया है। समस्या यह है कि केवल कुछ गुण तालिका में कॉलम में मैप किए जाते हैं। यह ठीक है क्योंकि डिस्प्ले के लिए उपयोग किए जाने वाले एकमात्र कॉलम मैप किए जाते हैं, हालांकि मैं सोच रहा था कि तालिका में अन्य कॉलम के खिलाफ पूछताछ करने का कोई तरीका है जो मेरी कक्षा में गुणों के लिए मैप नहीं किया गया है। इसलिए नहीं कि हम इसे कहीं भी प्रदर्शित कभी नहींएनएचबर्ननेट में क्वेरी अनमैड कॉलम

Customer 
----------- 
CustomerId 
Name 
DateCreated 

और हम एक वस्तु

public class Customer 
{ 
    public virtual int CustomerId {get;set;} 
    public virtual string name {get;set;} 
} 

और name और customerId है तथापि DateCreated मैप की जाती हैं है:

उदाहरण के लिए हम निम्नलिखित कॉलम के साथ एक मेज है । हम उन ग्राहकों के लिए Customer तालिका से पूछना चाहते हैं जो किसी निश्चित तिथि से बनाए गए थे। क्या DateCreated मैपिंग के बिना ऐसा करने का कोई तरीका है? इसके अलावा मानदंड API का उपयोग करके ऐसा करना बेहतर होगा।

उत्तर

11

आयुन्द रहीन ने एक लेख पोस्ट किया जो मैपिंग में access="noop" निर्दिष्ट करने के लिए क्वेरी-केवल गुण निर्दिष्ट करने का वर्णन करता है। NHibernate – query only properties देखें। मैंने यह कोशिश नहीं की है।

+0

यह वास्तव में अच्छी तरह से काम करता है और सेटअप करने में वास्तव में आसान है। – Goblin

+0

मुझे यह नहीं मिला संपत्ति तत्व के साथ काम करने के लिए - क्या इसमें कोई चाल है? –

+1

@DaleBurrell मैंने अभी भी इसका परीक्षण किया है, काम नहीं किया। दस्तावेज़ों के अनुसार 'नोप' 'संपत्ति 'तत्व पर' पहुंच 'विशेषता के लिए मान्य नहीं है (देखें [संदर्भ] (http://nhforge.org/doc/nh/en/#mapping-declaration-property))। –

5

प्रश्न से बाहर एक सादे एसक्यूएल क्वेरी का उपयोग कर रहा है? मैं अभी इसका परीक्षण करने में सक्षम नहीं हूं, लेकिन मुझे लगता है कि आप अप्रयुक्त फ़ील्ड पर क्वेरी कर सकते हैं, जब तक कि आपकी क्वेरी कुछ ऐसा न करे जो हाइबरनेट किसी ऑब्जेक्ट पर मैप कर सके। (खेद यह पहले से ही एक विकल्प के रूप की संभावना से इनकार किया गया था अगर)

संपादित करें:

ISQLQuery query = session.CreateSQLQuery(
       "select c.* " + 
       "from Customer c " + 
       "where c.CreateDate > :CreateDate"); 

query.SetDateTime("CreateDate", new DateTime(2009, 3, 14)); 
query.AddEntity(typeof(Customer)); 

IList<Customer> results = query.List<Customer>(); 
+0

(मेरे कॉलम नाम थोड़ा अलग थे) –

+0

यह प्रश्न से बाहर नहीं है, लेकिन यदि संभव हो तो मैं मानदंड एपीआई का उपयोग करने में सक्षम होना चाहूंगा। – lomaxx

5
HQL/मानदंड प्रश्नों के साथ

, NHibernate केवल क्या मैप किए जाने के साथ काम कर सकते हैं (हालांकि कच्चे एसक्यूएल है: यह काम करने के लिए लगता है एंडी व्हाइट ने अभी भी एक विकल्प बताया है)। यदि आप मानदंड प्रश्नों का उपयोग करना चाहते हैं, तो आपको कॉलम को मानचित्र बनाना होगा।

हालांकि, एनएचबेर्नेट सार्वजनिक रूप से सुलभ सदस्यों का उपयोग करने के लिए प्रतिबंधित नहीं है। इसलिए, यदि आप CreateDate फ़ील्ड को छिपाना जारी रखना चाहते हैं, तो एक निजी (शायद केवल पढ़ने के लिए) संपत्ति घोषित करें। वैकल्पिक रूप से, आप संपत्ति को छोड़ सकते हैं और मैपिंग में संपत्ति तत्व पर access="field" सेट करके फ़ील्ड स्तरीय पहुंच का उपयोग करने के लिए एनएचबीर्नेट को निर्देश दे सकते हैं।

मुझे पता है कि आप मैदान को मैप किए बिना ऐसा करना चाहते थे, लेकिन मुझे नहीं लगता कि यह संभव है (एनएचबीर्नेट स्रोत को संशोधित किए बिना;)। फिर भी, यदि आप इस क्षेत्र के खिलाफ पूछताछ कर रहे हैं तो फ़ील्ड में आपके डोमेन के लिए कुछ प्रासंगिकता है और इसलिए संभवतः इसमें मैप किए जाने का हकदार है, और एक निजी या संरक्षित सदस्य के साथ आप जानकारी छिपा सकते हैं।

+0

पोस्ट के लिए धन्यवाद मैंने एक निजी संपत्ति का उपयोग करने की कोशिश की, लेकिन आपके पास सी # में निजी वर्चुअल प्रॉपर्टी नहीं हो सकती है और निबर्ननेट को आभासी संपत्ति की आवश्यकता होती है :( –

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