2010-07-26 58 views
9

我已經開始使用NHibernate 3.0和PostgreSQL進行一個小型項目,到目前爲止,由於NHibernate網站已關閉,這個過程有點粗糙,我相信這個答案在他們的網站的某處。使用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; 

查詢將產生正確的SQL語句,很好。問題是,因爲我在我的列名大寫字母,你必須包起來引號,但生成的SQL代碼看起來是這樣的:

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,並用你的項目進行調試。

可能你可以從SessionFactor上的一個斷點開始yImpl.cs線171

if (settings.IsAutoQuoteEnabled) 

就以SchemaMetadataUpdater.cs

希望幫助一下方法公共靜態無效QuoteTableAndColumns(配置配置)

+1

hmm它會在'public override IDataBaseSchema GetDataBaseSchema(DbConnection connection)''拋出一個錯誤',因爲'PostgreSQLDialect' doesn'我不知道爲什麼沒有人爲PostgreSQL實現這個方法 – 2010-08-01 23:24:41

+1

感謝您在正確的方向上的點,我 – 2010-08-02 00:03:09

+2

@Nathan,你可以分享解決方案嗎? – 2011-04-04 13:36:01

2

中不要使用大寫字符表/列名稱,這將解決這個問題,使臨時查詢不那麼痛苦,因爲你將不必繼續引用他們

+1

唯一的問題是另一個程序(不是我自己做的)必須有大寫的列之一:( – 2010-07-26 22:03:47

4

我意識到這是一個相當古老的問題,但對於其他人,可能會在這裏結束,你也可以實現自定義命名策略,設置你的會話工廠時,你可以這樣:

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

在CustomNamingStrategy,實施接口NHibernate.Cfg.INamingStrategy和所有的方法基本上只是返回帶有引號的參數。