2010-03-13 9 views
10

मैं PostgreSQL के साथ fluentnhibernate का उपयोग कर रहा हूं। Fluentnhibernate अंतिम संस्करण है। PosrgreSQL संस्करण 8.4 है। बनाने ISessionFactory के लिए मेरे कोड:फ्लुएंट एनएचबेर्नेट और पोस्टग्रेएसक्यूएल, स्कीमामैटाडाटाउपटर। क्वोटटेबल और कॉलम - सिस्टम। नोट्स समर्थित नहीं है: निर्दिष्ट विधि समर्थित नहीं है

public static ISessionFactory CreateSessionFactory() 
{ 
     string connectionString = ConfigurationManager.ConnectionStrings["PostgreConnectionString"].ConnectionString; 
     IPersistenceConfigurer config = PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connectionString); 

     FluentConfiguration configuration = Fluently 
      .Configure() 
      .Database(config) 
      .Mappings(m => 
       m.FluentMappings.Add(typeof(ResourceMap))          
           .Add(typeof(TaskMap)) 
           .Add(typeof(PluginMap))); 
     var nhibConfig = configuration.BuildConfiguration(); 
     SchemaMetadataUpdater.QuoteTableAndColumns(nhibConfig); 
     return configuration.BuildSessionFactory(); 
} 

जब मैं लाइन SchemaMetadataUpdater.QuoteTableAndColumns पर कोड निष्पादित (nhibConfig) हूँ, फेंक त्रुटि: System.NotSupportedException: निर्दिष्ट विधि समर्थित नहीं है। कृपया मेरी मदद करें! मुझे समाधान की बहुत जरूरत है। सादर

उत्तर

8

इस प्रयास करें:

public static ISessionFactory CreateSessionFactory() 
{ 
     string connectionString = ConfigurationManager.ConnectionStrings["PostgreConnectionString"].ConnectionString; 
     IPersistenceConfigurer config = PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connectionString); 

     FluentConfiguration configuration = Fluently 
      .Configure() 
      .Database(config) 
      .Mappings(m => 
       m.FluentMappings.Add(typeof(ResourceMap))          
           .Add(typeof(TaskMap)) 
           .Add(typeof(PluginMap))); 
     configuration.ExposeConfiguration(x => x.SetProperty("hbm2ddl.keywords", "auto-quote")); 
     return configuration.BuildSessionFactory(); 
} 
+0

इसे कूल करें ('कॉन्फ़िगरेशन। एक्सप्लोर कॉन्फ़िगरेशन ... ') एमएस एसक्यूएल (कुछ आश्चर्यों के मामले में) के लिए भी काम करता है। – Nux

+2

इतना पुराना उत्तर, अभी भी इतना ताजा समाधान;) मैं एनएचबीर्नेट स्थिरता की प्रशंसा करता हूं ... –

2
  1. SchemaMetadataUpdater.QuoteTableAndColumns (nhibConfig);
  2. कॉन्फ़िगरेशन। एक्सप्लोर कॉन्फ़िगरेशन (x => x.SetProperty ("hbm2ddl.keywords", "auto-quote"));

मैंने दोनों से ऊपर की कोशिश की। यह मेरे लिए नवीनतम फ्लुएंट एनएचबेर्नेट (5f7adcd) और नवीनतम पोस्टग्रेस्क्ल 8.4 के साथ काम नहीं करता है। उन दोनों संभवतः फ़्लुएंट एनएचबर्ननेट द्वारा म्यूट पर हैं। यदि आप Fluent के बिना NHibernate और HBM का उपयोग करते हैं, तो यह आपके लिए काम करेगा।

आदेश स्पष्ट रूप से धाराप्रवाह NHibernate पूछने के लिए मेज और स्तंभ के लिए उद्धरित पहचानकर्ता उत्पन्न करने के लिए, मैं बंदर दो फ़ाइलों धाराप्रवाह NHibernate स्रोत में यह PostgreSQL के लिए काम करने के लिए मजबूर करने के लिए समझौता। (आप अन्य डेटाबेस के लिए एक ही निर्माण की जरूरत नहीं है)

नाम स्थान: FluentNHibernate.MappingModel.Output

  1. "उद्धृत" XmlClassWriter.cs

    if (classMapping.HasValue(x => x.TableName)) 
        classElement.WithAtt("table", new System.Text.StringBuilder().Append("\"").Append(classMapping.TableName).Append("\"").ToString()); 
    
  2. पर तालिका नाम में जोड़े पर कॉलम नाम में "उद्धरण" जोड़ें XmlColumnWriter.cs

    if (columnMapping.HasValue(x => x.Name)) 
        element.WithAtt("name", new System.Text.StringBuilder().Append("\"").Append(columnMapping.Name).Append("\"").ToString()); 
    

यह अब तक आकर्षण की तरह काम करता है। http://github.com/jagregory/fluent-nhibernate पर स्रोत प्राप्त करें और उपरोक्त अपडेट के साथ अपना खुद का निर्माण करें।

+0

पोस्टग्रेएसक्यूएल को "उद्धृत" माना जाता है क्योंकि संवेदनशील, गैर-उद्धृत इंडेंटिफायर केस असंवेदनशील होते हैं लेकिन सभी कम मामले में तब्दील होते हैं, जिसका अर्थ है कि यदि आप अपेक्षा नहीं करते हैं Fluent NHibernate आपके लिए केस संवेदनशील "उद्धृत" क्वेरी उत्पन्न करने के लिए, आप केवल अपने सभी टेबल और कॉलम का नाम कम केस नामों में बदल सकते हैं, जिससे अगली बार जब आप उन्हें देखते हैं तो आपको अजीब लगेगा। :] – stoto

1

अपना कस्टम नामकरण सम्मेलन बनाएं, उद्धरण शामिल करने के लिए कॉलम नाम सम्मेलन को ओवरराइड करें।

var fluentConfig = Fluently.Configure(new  Configuration().SetNamingStrategy(PostgreNamingStragegy.Instance)) 

internal class PostgreNamingStragegy: INamingStrategy 
    { 
    private static readonly INamingStrategy ImprovedNamingStrategy = NHibernate.Cfg.ImprovedNamingStrategy.Instance; 

    private static PostgreNamingStragegy_postgreNamingStrategy; 
    public static INamingStrategy Instance 
    { 
     get { return _postgreNamingStrategy?? (_postgreNamingStrategy= new PostgreNamingStragegy()); } 
    } 

    protected PostgreNamingStragegy() 
    { 
    } 

    public string ClassToTableName(string className) 
    { 
     return ImprovedNamingStrategy.ClassToTableName(className); 
    } 

    public string ColumnName(string columnName) 
    { 
     return "\"" + columnName + "\""; 
    } 

    public string LogicalColumnName(string columnName, string propertyName) 
    { 
     return ImprovedNamingStrategy.LogicalColumnName(columnName, propertyName); 
    } 

    public string PropertyToColumnName(string propertyName) 
    { 
     return ImprovedNamingStrategy.PropertyToColumnName(propertyName); 
    } 

    public string PropertyToTableName(string className, string propertyName) 
    { 
     return ImprovedNamingStrategy.PropertyToTableName(className, propertyName); 
    } 

    public string TableName(string tableName) 
    { 
     return ImprovedNamingStrategy.TableName(tableName); 
    } 
} 
संबंधित मुद्दे