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 位编译。
我哪里错了(或者原来的PostgreSQLDialect方言有bug)?
感谢您的提示
ID
trigger-identity
生成器不受动态插入 dynamic-insert="true"
支持。相关错误报告:https://github.com/nhibernate/nhibernate-core/issues/1062
所以只需为您的实体禁用动态插入,它应该可以工作 (dynamic-insert="false"
)。
我有 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 位编译。
我哪里错了(或者原来的PostgreSQLDialect方言有bug)?
感谢您的提示
ID
trigger-identity
生成器不受动态插入 dynamic-insert="true"
支持。相关错误报告:https://github.com/nhibernate/nhibernate-core/issues/1062
所以只需为您的实体禁用动态插入,它应该可以工作 (dynamic-insert="false"
)。