代码之家  ›  专栏  ›  技术社区  ›  Nathan W

用NHibernate和PostgreSQL引用列名

  •  9
  • Nathan W  · 技术社区  · 14 年前

    我已经开始在一个小项目中使用nhibernate3.0和PostgreSQL,到目前为止,由于NHibernate的网站已经关闭,我确信这个答案在他们的网站上。

    int ID
    String Feature
    

    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
    

    列周围没有引号。如果我运行这个我会得到一个“column this\ id”is not found等等。

    有人知道如何让NHibernate将列名用引号括起来吗?

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

    我尝试添加.ExposeConfiguration(cfg=>SetProperty(“hbm2ddl.keywords”,“auto quote”),但它似乎什么都没做。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Rafael Mueller    14 年前

    hbm2ddl.keywords 是应该为你这样做,但它不起作用,我建议你抓住 nhibernate source

    很可能您可以从SessionFactoryImpl.cs第171行的断点开始

    if (settings.IsAutoQuoteEnabled)
    

    看一看方法

    希望有帮助。

        2
  •  4
  •   Hyddan    12 年前

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

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

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

        3
  •  2
  •   araqnid    14 年前