C# 使用NHibernate和PostgreSQL引用列名

C# 使用NHibernate和PostgreSQL引用列名,c#,nhibernate,postgresql,fluent-nhibernate,C#,Nhibernate,Postgresql,Fluent Nhibernate,我已经开始在一个小项目中使用NHibernate 3.0和PostgreSQL,到目前为止,由于NHibernate网站已经关闭,所以过程有点艰难,我确信这个答案在他们的网站上的某个地方 我有一个包含这两列的数据库(当然,实际表中还有更多列): 现在我使用FluentNHibernate进行映射,如下所示: public class MyEntityMap: ClassMap<MyEntity> { public MyEntityMap() { Id(

我已经开始在一个小项目中使用NHibernate 3.0和PostgreSQL,到目前为止,由于NHibernate网站已经关闭,所以过程有点艰难,我确信这个答案在他们的网站上的某个地方

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

现在我使用FluentNHibernate进行映射,如下所示:

public class MyEntityMap: ClassMap<MyEntity>
{
    public MyEntityMap()
    {
        Id(x => x.ID);
        Map(x => x.Feature);
    }
}
SELECT this_.ID as ID0_0_, this_.feature as feature0_0_, 
       FROM "MyEntity" this_ WHERE this_.ID < 5
公共类MyEntityMap:ClassMap
{
公共MyEntityMap()
{
Id(x=>x.Id);
地图(x=>x.Feature);
}
}
和一个LINQ查询来获取数据

var strucs = from str in session.Query<MyEntity>()
             where str.ID < 5
             select str;
var strucs=from会话中的str.Query()
其中str.ID<5
选择str;
该查询将生成适当的SQL语句,大致上是这样的。问题是,因为我的列名中有大写字母,所以必须用引号将它们括起来,但生成的SQL代码如下所示:

public class MyEntityMap: ClassMap<MyEntity>
{
    public MyEntityMap()
    {
        Id(x => x.ID);
        Map(x => x.Feature);
    }
}
SELECT this_.ID as ID0_0_, this_.feature as feature0_0_, 
       FROM "MyEntity" this_ WHERE this_.ID < 5
将此\u0.ID选择为ID0\u0\u0,将此\u0.feature选择为feature0\u0\u0,
从“MyEntity”这里,这里ID<5
列的周围没有引号。如果我运行这个,我会得到一个“column this.id”未找到等

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

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


我尝试添加.ExposeConfiguration(cfg=>cfg.SetProperty(“hbm2ddl.keywords”,“自动引用”)但它似乎没有任何作用。

不要在表/列名中使用大写字符。这将解决此问题,并减少临时查询的痛苦,因为您不必一直引用它们。

既然它应该为您这样做,但它不起作用,我建议您抓取它,并在项目中调试它

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

if (settings.IsAutoQuoteEnabled)
查看SchemaMetadataUpdater.cs上的方法public static void QuoteTableAndColumns(配置)


希望这能有所帮助。

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

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

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

唯一的问题是另一个程序(不是我制作的)必须有一列大写:(嗯,它在
公共覆盖IDataBaseSchema GetDataBaseSchema(DbConnection connection)
上抛出一个错误,因为
PostgreSqlDialent
没有覆盖它以提供一个,所以
if处的代码(settings.IsAutoQuoteEnabled)
抛出一个异常,他们只是忽略了它。我想知道为什么没有人为PostgreSQL实现该方法。多亏了方向正确,我为PostgreSQL方言实现了自己的quick GetDataBaseSchema,现在似乎工作正常。@Nathan,你能分享解决方案吗?仅供参考,SchemaMetadataUpdate中的代码er仅在RDBMS的“保留”字中添加引号。所有其他字将保持不被引用。