用NHibernate和PostgreSQL引用列名

我已经开始使用NHibernate 3.0和PostgreSQL进行一个小项目,到目前为止,由于NHibernate站点已关闭,这个过程有点粗糙,我确信这个答案在他们的网站上。

我有一个包含这两列的数据库(当然在实际表中还有更多):

int ID String Feature 

现在我使用FluentNHibernate进行映射,所以这样的事情:

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

和一个LINQ查询来获取数据

 var strucs = from str in session.Query() 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”,“auto-quote”)但它似乎没有做任何事情。

因为hbm2ddl.keywords应该为你做这个并且它不起作用,我建议你抓住nhibernate源代码 ,并用你的项目调试它。

可以说,你可以在SessionFactoryImpl.cs第171行的断点处开始

 if (settings.IsAutoQuoteEnabled) 

看看SchemaMetadataUpdater.cs上的方法public static void QuoteTableAndColumns(Configuration configuration)

希望有所帮助。

我意识到这是一个相当古老的问题,但对于其他可能最终在这里你可以实现自定义命名策略的人,在设置你的会话工厂时你会添加:

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

在CustomNamingStrategy中,实现NHibernate.Cfg.INamingStrategy接口,对于所有方法,基本上只返回带引号的参数。

不要在表/列名称中使用大写字符。 这将解决这个问题,并使临时查询不那么痛苦,因为你不必继续引用它们。