用NHibernate和PostgreSQL引用列名

Nat*_*n W 9 c# postgresql nhibernate fluent-nhibernate

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

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

int ID
String Feature
Run Code Online (Sandbox Code Playgroud)

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

public class MyEntityMap: ClassMap<MyEntity>
{
    public MyEntityMap()
    {
        Id(x => x.ID);
        Map(x => x.Feature);
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个LINQ查询来获取数据

var strucs = from str in session.Query<MyEntity>()
             where str.ID < 5
             select str;
Run Code Online (Sandbox Code Playgroud)

该查询将生成正确的SQL语句.问题是,因为我的列名中有大写字母,你必须用引号将它们包装起来,但生成的SQL代码看起来像这样:

SELECT this_.ID as ID0_0_, this_.feature as feature0_0_, 
       FROM "MyEntity" this_ WHERE this_.ID < 5
Run Code Online (Sandbox Code Playgroud)

列中没有引号.如果我运行这个,我得到一个"列this_.id"找不到等.

有谁知道如何让NHibernate将列名包装在引号中?

编辑:我不能小写列名称,因为有些列第三方程序需要全部为大写.

我尝试添加.ExposeConfiguration(cfg => cfg.SetProperty("hbm2ddl.keywords","auto-quote")但它似乎没有做任何事情.

Hyd*_*dan 5

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

Fluently.Configure(new Configuration()
    .SetNamingStrategy(new CustomNamingStrategy()))...
Run Code Online (Sandbox Code Playgroud)

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


Raf*_*ler 3

由于hbm2ddl.keywords应该为您执行此操作但它不起作用,因此我建议您获取nhibernate source,并在您的项目中调试它。

也许您可以从 SessionFactoryImpl.cs 第 171 行上的断点开始

if (settings.IsAutoQuoteEnabled)
Run Code Online (Sandbox Code Playgroud)

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

希望有帮助。

  • @Nathan,你能分享一下解决方案吗? (2认同)