当 ID < 时 NHibernate 写入 value = NULL 0
我们想要实现一个简单的规则,其中当实体的 ID 等于 -1 时,NHibernate 将向数据库分配(保留)NULL。例如,我们有一个“系统内”帐户,应将其作为 NULL 持久保存到数据库中。
如果我们尝试将 ID -1 持久保存到数据库中,则会出现外键异常,因为外部表中不存在该 ID。
我们使用 NHibernate 和 FluentNhibernate。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为您没有正确映射您的实体。如果它是正确的,您应该使用任何技巧:您不应该看到 ID,而是对另一个实体的引用,在这种情况下,您将保留带有空值的引用。即使在错误的情况下,您也希望使用表示为 ID 的引用来映射实体(这几乎总是错误的),如果该 id 可为空,则将其映射为可为空,这样您就拥有了 int?并且您可以将 null 表示为 null,而不是使用 -1 技巧。
查看评论
如果自定义实体在内部用作 null 值,则会话拦截器可以提供帮助:处理 OnSave 并通过用 null 替换虚拟实体来处理特殊情况。
您可以在此处找到文档 关于 NH 拦截器。
在同一文档的 11.2 章节中,有与事件相关的部分,相当于此类问题。
I think you didn't a proper mapping of your entity. If it were correct, you should made any trick: you should not see an ID, but a reference to another entity, and in this case you will persist the reference with a null value. Even in the wrong case you want map the entity with a reference expressed as an ID ( that is almost always wrong ) if this id is nullable, map it as a nullable so you have int? and you can fit null to mean null, instead of the -1 trick.
See Comments
If a custom entity is internally used as a null value, a session interceptor could help: working on the OnSave and treat the special case by replacing the dummy entity with null.
Here you can find the documentation about NH interceptors.
At the 11.2 chaper od the same doc there is the portion related to events, equivalents for this kind of problem.