Nhibernate PostgreSQL 方言在 INSERT 语句中不使用 "returning"

Nhibernate PostgreSQL dialect does not use "returning" in INSERT statement

我有 PG table,其中 PK 由触发器填充。在 pgAdmin 中它运行良好。 NH 映射是:

<class name="Dokument" schema="srk" table="`Dokumenty`" lazy="true" dynamic-update="true" dynamic-insert="true" optimistic-lock="dirty">
  <id name="IdDHash" column="`IdDHash`" type="Int32" generator="trigger-identity" />

我尝试创建我的测试 NH 方言以确保 NH 将“返回”关键字添加到 SQL 插入:

namespace NHibernate.Dialect
{
    public class SzgPostgeSQLDialect : PostgreSQLDialect
    {
        public override SqlString AddIdentifierOutParameterToInsert(SqlString insertString, string identifierColumnName, string parameterName)
        {
            SqlString pom = base.AddIdentifierOutParameterToInsert(insertString, identifierColumnName, parameterName);

            return insertString.Append(" returning ", identifierColumnName);
        }

我这里设置了断点,确定插入命令修改的很好:

INSERT INTO srk."Dokumenty" ("KodDSkup", "Cesta", "Nazev") VALUES (?, ?, ?) returning "IdDHash"

但是当我保存对象时出现异常,我看到 NH 使用了“未修改的插入”语句:

NHibernate: INSERT INTO srk."Dokumenty" ("KodDSkup", "Cesta", "Nazev") VALUES (:p0, :p1, :p2);:p0 = 1 [Type: Int32 (0:0:0)], :p1 = '123' [Type: String (0:0:0)], :p2 = 'Test1' [Type: String (0:0:0)], :nhIdOutParam = NULL [Type: Int32 (0:0:0)]

NHibernate for PG好像没有使用修改后的insert命令

C#、VS Professional 2019、NuGet 的 Npgsql 5.0.7 和 NHibernate 5.3.9、PostgreSQL 12.8 由 Visual C++ build 1914 64 位编译。

我哪里错了(或者原来的Pos​​tgreSQLDialect方言有bug)?

感谢您的提示

ID

trigger-identity 生成器不受动态插入 dynamic-insert="true" 支持。相关错误报告:https://github.com/nhibernate/nhibernate-core/issues/1062

所以只需为您的实体禁用动态插入,它应该可以工作 (dynamic-insert="false")。