2010-07-26 12 views
9

के साथ कॉलम नामों का उद्धरण करना मैंने एक छोटी परियोजना के लिए एनएचबीरनेट 3.0 और पोस्टग्रेएसक्यूएल का उपयोग करना शुरू कर दिया है, अब तक एनएचबीरनेट साइट के कारण सवारी थोड़ी सी नाराज रही है और मुझे यकीन है कि यह उत्तर उनके उत्तर पर है वेबसाइट कहीं कहीं।NHibernate और PostgreSQL

मैं एक डेटाबेस है कि इन दो कॉलम (निश्चित रूप से वहाँ वास्तविक तालिका में अधिक है) है:

int ID 
String Feature 

अब मैं एक FluentNHibernate उपयोग कर रहा हूँ मानचित्रण ऐसा करने कुछ इस तरह:

public class MyEntityMap: ClassMap<MyEntity> 
{ 
    public MyEntityMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.Feature); 
    } 
} 

और एक LINQ क्वेरी डेटा

var strucs = from str in session.Query<MyEntity>() 
      where str.ID < 5 
      select str; 

क्वेरी उचित उत्पन्न होगा बाहर निकलने के लिए एसक्यूएल स्टेटमेंट, अच्छी तरह से। समस्या यह है, क्योंकि मैं अपने कॉलम नामों बड़े अक्षरों का है कि आप उन्हें उद्धरण में रैप करने के लिए है, लेकिन उत्पन्न एसक्यूएल कोड इस तरह दिखता है:

SELECT this_.ID as ID0_0_, this_.feature as feature0_0_, 
     FROM "MyEntity" this_ WHERE this_.ID < 5 

कहाँ कॉलम उनके आसपास उद्धरण नहीं है। मैं हो, तो मैं इस चलाने के एक "कॉलम this_.id" नहीं मिला है आदि

किसी को भी पता है कि कैसे मैं NHibernate उद्धरण में स्तंभ नाम रैप करने के लिए मिल सकता है?

संपादित करें: मैं कॉलम नामों को कम नहीं कर सकता क्योंकि कुछ कॉलम हैं जो किसी तृतीय पक्ष प्रोग्राम को अपरकेस में होना चाहिए।

मैं .ExposeConfiguration जोड़ने की कोशिश की (cfg => cfg.SetProperty ("hbm2ddl.keywords", "ऑटो बोली") लेकिन यह में अपरकेस वर्णों का प्रयोग न करें कुछ भी करने को नहीं लगता है।

उत्तर

3

चूंकि hbm2ddl.keywords आपके लिए यह करना है और यह काम नहीं कर रहा है, तो मैं सुझाव दूंगा आप nhibernate source को पकड़ने के लिए, और इसे अपने प्रोजेक्ट से डीबग करें।

संभवतः आप सत्र फ़ैक्टर पर ब्रेकपॉइंट के साथ शुरू कर सकते हैं yImpl.cs लाइन 171

if (settings.IsAutoQuoteEnabled) 

एक विधि पर public static void QuoteTableAndColumns (विन्यास विन्यास) SchemaMetadataUpdater.cs

आशा है कि मदद करता है पर नजर डालें।

+1

हम्म स्तंभों में से एक है करने के लिए है ' इसे एक प्रदान करने के लिए इसे ओवरराइड करें, इसलिए 'if (settings.IsAutoQuoteEnabled)' पर कोड अपवाद फेंकता है और वे इसे अनदेखा करते हैं। मुझे आश्चर्य है कि किसी ने पोस्टग्रेएसक्यूएल के लिए उस विधि को क्यों लागू नहीं किया है। –

+1

सही दिशा में बिंदु के लिए धन्यवाद, मैं PostgreSQLDialect के लिए अपना खुद का त्वरित GetDataBaseSchema लागू किया और ऐसा लगता है कि अब ठीक काम कर रहा है। –

+2

@Nathan, क्या आप समाधान साझा कर सकते हैं? –

2

तालिका/कॉलम नाम। इससे इस समस्या को हल किया जाएगा और आपको विज्ञापन को कम दर्दनाक बना दिया जाएगा क्योंकि आपको उन्हें उद्धृत रखना नहीं होगा।

+1

समस्या सिर्फ एक अन्य कार्यक्रम (नहीं मेरे द्वारा) यह 'पर सार्वजनिक ओवरराइड IDataBaseSchema GetDataBaseSchema (DbConnection कनेक्शन)' क्योंकि 'PostgreSQLDialect' नहीं करता है एक त्रुटि फेंकता अपरकेस में :( –

4

मुझे पता है यह एक नहीं बल्कि पुराने सवाल है, लेकिन दूसरों कि यहाँ अंत आप भी एक कस्टम नामकरण रणनीति को लागू कर सकता है हो सकता है के लिए, जब आपका सत्र कारखाने की स्थापना आप जोड़ना होगा:

Fluently.Configure(new Configuration() 
    .SetNamingStrategy(new CustomNamingStrategy()))... 

CustomNamingStrategy में, लागू इंटरफ़ेस NHibernate.Cfg.INamingStrategy और सभी विधियों के लिए मूल रूप से केवल पैरामीटर को उनके चारों ओर उद्धरण के साथ वापस कर दें।