【问题标题】:Quoting column names with NHibernate and PostgreSQL用 NHibernate 和 PostgreSQL 引用列名
【发布时间】:2011-03-20 22:13:19
【问题描述】:

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

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

int ID
String Feature

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

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

列周围没有引号的地方。如果我运行它,我会得到一个“列 this_.id”,等等。

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

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

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

【问题讨论】:

    标签: c# nhibernate postgresql fluent-nhibernate


    【解决方案1】:

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

    【讨论】:

    • 唯一的问题是另一个程序(不是我制作的)必须有一个大写的列:(
    【解决方案2】:

    由于 hbm2ddl.keywords 应该为您执行此操作,但它不起作用,我建议您使用 nhibernate source,并使用您的项目对其进行调试。

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

    if (settings.IsAutoQuoteEnabled)
    

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

    希望对您有所帮助。

    【讨论】:

    • hmm 它会在public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) 上引发错误,因为PostgreSQLDialect 不会覆盖它以提供错误,因此if (settings.IsAutoQuoteEnabled) 处的代码会引发异常并且他们只是忽略它。我想知道为什么没有人为 PostgreSQL 实现这种方法。
    • 感谢您指出正确的方向,我为 PostgreSQLDialect 实现了自己的快速 GetDataBaseSchema,它现在似乎工作正常。
    • @Nathan,你能分享一下解决方案吗?
    • 仅供参考,SchemaMetadataUpdater 中的代码仅在您的 RDBMS 的“保留”单词中添加引号。所有其他词都不会被引用。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2021-01-08
      相关资源
      最近更新 更多