C# 防止NHibernate向生成的insert语句添加Returning子句

C# 防止NHibernate向生成的insert语句添加Returning子句,c#,nhibernate,greenplum,postgresql,C#,Nhibernate,Greenplum,Postgresql,我目前正在使用NHibernate在我的数据库中创建条目,从使用.NET库允许与之交互的API中提取数据。我目前正在使用Greenplum,不幸的是它不支持RETURNING子句(添加到NHibernate生成的查询的末尾) 我想知道是否可以禁止在INSERT语句末尾添加“returning id”?就像我在Python中使用SQLAlchemy(我更熟悉SQLAlchemy)执行类似的操作一样,我可以执行以下操作来防止添加返回子句: engine = create_engine(con

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

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

    engine = create_engine(conn_str, implicit_returning=False)
希望我已经提供了足够的信息,任何帮助将不胜感激

亲切问候,

Adam Styles

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

由于它源于,您可以尝试使用PostgreSQL方言。这可能已经是您正在做的事情了,但是您需要使用一个不支持返回insert()的插件
PostgreSqlDialogue
并不声称支持它,但
PostgreSql81Dialogue
和更高版本都支持它。因此,请尝试使用
PostgreSqlDialogue

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

注:

  • 当在insert上使用由db端生成的ID(如identity)时,会出现此问题。使用其他生成器策略也可以避免麻烦,同时还具有不触发
    ISession.Save上的立即
    insert
    的额外好处,从而实现批处理、更好的工作单元语义
  • 使用事务!否则,当禁用
    方言.SupportsInsertSelectIdentity
    时,错误可能会导致应用程序检索插入的id失败。(以多种形式显示:,。或者,您可以设置
    连接。在关闭时将\u mode
    配置属性释放为

  • Greenplum不是为单例insert语句设计的,因此如果您试图插入很多行,即使您避开了这个问题,性能也会很差。您需要使用gpload来加载数据。