【问题标题】:NHibernate mapping with two special cases具有两种特殊情况的 NHibernate 映射
【发布时间】:2011-03-04 14:37:21
【问题描述】:

我正在使用 NHibernate 将类映射到数据库表。 Part 表有一个 ID 列(主键)和一个 ParentPart 列(以及其他一些列)。

class Part
{
    public virtual long ID{ get; set; }
    public virtual Part ParentPart { get; set; }   
}

ParentPart 通常是零件表中的另一个有效零件,但我有两种特殊情况。我有一种情况,ParentPart 列可以为 0(零),另一种情况可以为 -1。这两种情况目前都不代表另一个有效的 Part 对象。我在想我可以制作两个永远不会持续存在的 Part 子类(ZeroPart 和 NegativeOnePart)。我希望在列中输入零和 -1 值,但不保留整个 ZeroPart 或 NegativeOnePart 对象。我不确定如何映射它(我正在使用 hbm 文件)或者这是否是正确的方法。

我如何映射它以便保留正常的有效部分,但我也可以处理特殊情况?

顺便说一句:我当前的 hbm 文件的 Part.ID 的未保存值为零,但我认为我可以在映射中将其更改为不同的值并在类中默认它。

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    如果我对您的理解正确,您有一个树结构,并且您想要分配在持久化对象时不应持久化到数据库的虚拟对象(ID = 0 或 ID = -1)。 ParentPart 列应包含 ID = 0 或 -1,具体取决于某些条件。

    基于此信息,我假设您的表中没有外键,因此保存 ParentPart = 0 或 -1 的对象不会导致违反参照完整性。在正常情况下,我建议使用外键并在 ParentPart 列中允许 NULL。

    但是,由于您希望使用两个不同的值(0 和 -1)作为不存在父级的指示符,我相信您最好的选择可能只是在数据库中创建两个条目(均具有 ParentPart = NULL)。

    如果您完全不想添加这些条目,可以查看intereceptors and events。

    我认为您无法在映射文件中解决此问题。 NHibernate 映射功能不是为处理这种特定逻辑而设计的,也不应该这样做。

    (在数据库中有这种逻辑可能不是很理想,但听起来这不是一个新项目,所以我们不需要在这里争论。)

    【讨论】:

      【解决方案2】:

      您的“parts”表中是否会有Part 值具有指定的 ID,以保持参照完整性?

      如果是这样,那么我建议创建两个特殊的 Part 实例,每个实例代表您的模型所暗示的特殊情况。当您想要分配这些实例时,您需要从数据库中获取它们,但这可以通过您的存储库中的一些辅助方法来简化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-31
        • 1970-01-01
        • 2016-10-23
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 2016-12-13
        相关资源
        最近更新 更多