【问题标题】:NHibernate write value = NULL when ID < 0当 ID < 0 时 NHibernate 写入值 = NULL
【发布时间】:2011-07-05 04:20:48
【问题描述】:

我们想实现一个简单的规则,当实体的 ID 等于 -1 时,NHibernate 将分配(持久)NULL 给数据库。例如,我们有一个“系统内”帐户,应该将其作为 NULL 持久化到数据库中。

如果我们尝试将 -1 的 ID 持久化到数据库中,则会出现外键异常,因为该 ID 不存在于外部表中。

我们正在使用 NHibernate 和 FluentNhibernate。

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate null


    【解决方案1】:

    我认为您没有正确映射您的实体。如果它是正确的,您应该采取任何技巧:您不应该看到 ID,而是对另一个实体的引用,在这种情况下,您将使用 null 值保存引用。即使在错误的情况下,您也希望使用表示为 ID 的引用来映射实体(这几乎总是错误的),如果此 id 可以为空,请将其映射为可以为空的,以便您拥有 int?你可以用 null 来表示 null,而不是 -1 技巧。

    查看评论

    如果自定义实体在内部用作空值,会话拦截器可能会有所帮助:处理 OnSave 并通过将虚拟实体替换为空来处理特殊情况。 Here you can find the documentation 关于 NH 拦截器。 在同一个文档的 11.2 章节中,有与事件相关的部分,此类问题的等价物。

    【讨论】:

    • 谢谢菲利斯。我应该澄清一下。我们正在持久化对对象的引用,而不是 ID 本身。我们在应用程序内部创建一个 ID = -1 的对象。如果将此实体分配给属性,则持久化到数据库的属性值应为 NULL
    • 谢谢菲利斯。我读到拦截器已被最新版本的 NHibernate 中的事件所取代。我需要为 OnLoad 和 OnSave 创建哪些事件侦听器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多