用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接口,对于所有方法,基本上只返回带引号的参数。
不要在表/列名称中使用大写字符。 这将解决这个问题,并使临时查询不那么痛苦,因为你不必继续引用它们。