2010-03-13 39 views
10

我使用fluentnhibernate和PostgreSQL。 Fluentnhibernate是最後一個版本。 PosrgreSQL版本是8.4。 我爲創建ISessionFactory代碼:Fluent NHibernate和PostgreSQL,SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:不支持指定的方法

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

酷(配置.ExposeConfiguration ...)也適用於MS SQL(萬一有些奇蹟)。 – Nux 2011-09-09 12:51:58

+2

這麼舊的答案,仍然如此新鮮的解決方案;)我很欽佩NHibernate的一致性... – 2013-05-22 05:50:26

2
  1. SchemaMetadataUpdater.QuoteTableAndColumns(nhibConfig);
  2. configuration.ExposeConfiguration(x => x.SetProperty(「hbm2ddl.keywords」,「auto-quote」));

我上面都試過。最新的Fluent NHibernate(5f7adcd)和最新的postgresql 8.4並不適合我。這兩個是可能是通過Fluent NHibernate靜音。如果您在沒有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

PostgreSQL認爲「引用」作爲區分大小寫,不加引號的標識符不區分大小寫,但都摺疊爲小寫,這意味着如果你不期望流利的NHibernate爲您生成區分大小寫的「引用」查詢,您可以將所有表和列重命名爲小寫名稱,這會讓您在下次看到它們時感到奇怪。 :] – stoto 2010-04-20 00:48:12

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); 
    } 
} 
相關問題