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
生成器。它根据底层数据库支持的内容在Identity
、Sequence
或HiLo
之间切换。
见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
NHibernate Postgresql DateTime到时间转换