2010-07-26 57 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和所有的方法基本上只是返回带有引号的参数。