防止 NHibernate 将返回子句添加到生成的插入语句中



我目前正在使用NHibernate在我的数据库中创建条目,当从使用.NET库允许与之交互的API中提取数据时。我目前正在使用Greenplum,不幸的是它不支持RETURN子句(添加到NHibernate生成的查询的末尾)。

我想知道是否可以禁止在 INSERT 语句的末尾添加"返回 id"?就好像我在 Python 中使用 SQLAlchemy 做类似的事情一样(我更熟悉),我可以执行以下操作来防止添加 RETURN 子句:

engine = create_engine(conn_str, implicit_returning=False)

希望我提供了足够的信息,任何帮助将不胜感激。

亲切问候

亚当·斯泰尔斯

您需要使用与数据库兼容的 SQL 方言。参考文档可能不完整,请查看检查所有现有方言的来源。Greenplum目前看起来没有专门的方言。

由于它源自postgresql,你可以尝试使用PostgreSQL方言。这可能已经是您正在做的事情,但是您需要使用一个不声称支持返回插入(Dialect.SupportsInsertSelectIdentity)。PostgreSQLDialect并没有声称支持它,但PostgreSQL81Dialect和后来都这样做了。所以试试PostgreSQLDialect.

您可以改为为Greenplum编写和使用方言,方法是从最接近的合适现有方言派生,然后覆盖需要更改的内容。(如果您愿意,您可以将其贡献给NHibernate。

笔记:

  1. 当使用插入时在数据库端生成的 id(如身份)时,会出现这种麻烦。使用其他生成器策略也可以避免麻烦,同时具有不触发ISession.Save立即insert的额外好处,从而实现批处理,更好的工作单元语义,...
  2. 使用交易!否则,禁用Dialect.SupportsInsertSelectIdentity时,错误可能会导致应用程序无法检索插入的 ID。 (以多种形式出现:NH-926、NH-2145、NH-3600。或者,您可以将connection.release_mode配置属性设置为on_close.)

最新更新