PostgreSQL 与 NHibernate 的映射

Posted

技术标签:

【中文标题】PostgreSQL 与 NHibernate 的映射【英文标题】:PostgreSQL mapping with NHibernate 【发布时间】:2017-08-20 08:03:05 【问题描述】:

我正在 SQL Server 和 PostgreSQL 上使用 NHibernate。我在使用 PostgreSQL 映射 auto_increment 属性时遇到了一些问题。

  Id(c => c.PlayerId, map => map.Generator(Generators.Identity));

以这种方式映射 PlayerId 会在插入 PostgreSQL 数据库时出错。 将Generators.Identity 更改为Generators.Increment,并将映射文件加倍工作正常。 但此时更改或加倍映射文件在我的项目中不是一个选项。

有什么解释为什么 Generators.Identity 映射在 PostgreSQL 中不起作用?谢谢你。

这是我得到的错误:

    could not insert: [Company.DataMigration.DataBase.Entities.Player][SQL: INSERT INTO Player (PlayerId, PlayerName, PlayerAge, DOJ, BelongsTo) VALUES (nextval ('hibernate_sequence'), ?, ?, ?, ?) returning PlayerId]

【问题讨论】:

【参考方案1】:

在我看来,您的 PostgreSQL 数据库可能缺少所需的序列。您可能没有通过 NHibernate 创建模式,然后您必须自己创建用于生成 id 的序列。它的名字应该是hibernate_sequence,但是完整的错误信息应该会告诉你。

您可以改用Native 生成器。它根据底层数据库支持的内容在IdentitySequenceHiLo 之间切换。

见generator documentation。

请注意,这些生成器的行为彼此完全不同,这可能会根据选择的生成器产生问题。为避免目标数据库之间出现此类差异,请改用enhanced generator:它将在大多数数据库上使用相同的行为。

【讨论】:

谢谢,我去看看 嘿,@frédéric,usin Native 一直告诉我这个错误无法获得下一个序列值,知道吗? 您的问题没有提供足够的细节来进一步挖掘。尝试提供MCVE,并提供完整的异常消息(在其上调用.ToString(),或者如果在Visual Studio 下调试,请单击“将异常详细信息复制到剪贴板”)。例如,在 SqlException 的情况下,一些细节可能仍然缺失:检查其 Errors 属性并从中提取相关消息。指明您使用的 NHibernate 和 PostegreSQL 版本。 NHibernate.Test 项目有大量使用native 和 PostgreSQL 的测试,众所周知,它可以工作。 我仍然对错误原因进行了猜测,请阅读我上面的编辑。 我使用序列生成器 Id(c => c.PlayerId, map => map.Generator(Generators.Sequence, gmap => gmap.Params(new sequence = "player_playerid_seq" )); )

以上是关于PostgreSQL 与 NHibernate 的映射的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 似乎没有批量插入 PostgreSQL

Abp.NHibernate连接PostgreSQl数据库

NHibernate Postgresql DateTime到时间转换

与 PostgreSQL 一起使用的 Mono ORM?

NHibernate - 从 PGSQL 迁移到 MSSQL 时语法不正确

如何使用nhibernate / lightcore注册两个数据库连接?