我正在使用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)的2个子类。我希望在列中输入零和-1值,但不能保留整个ZeroPart或NegativeOnePart对象。我不确定如何映射(我正在使用hbm文件)或者这是否正确的方法。
我如何映射这个以便保持正常的有效部分,但我也可以处理特殊情况?
顺便说一句:我当前的hbm文件将Part.ID的未保存值设为零,但我想我可以在映射中将其更改为不同的值,并将其默认为类。
答案 0 :(得分:0)
您的“部分”表中是否会有Part
个值与指定的ID,以保持参照完整性?
如果是这样,那么我建议创建两个特殊的Part
实例,每个实例代表模型所暗示的特殊情况。当你想要分配它们时,你需要从数据库中获取这些实例,但是这可以通过你的存储库中的一些帮助方法变得简单。
答案 1 :(得分:0)
如果我理解正确,你有一个树结构,你想要分配虚拟对象(ID = 0或ID = -1),在持久化对象时不应该持久化到数据库。 ParentPart列应包含ID = 0或-1,具体取决于某些标准。
基于此信息,我假设您的表中没有外键,因此保存ParentPart = 0或-1的对象不会导致违反参照完整性。在正常情况下,我建议使用外键并在ParentPart列中允许NULL。
但是,由于您需要两个不同的值(0和-1)作为不存在父项的指示符,我相信您最好的选择可能只是在数据库中创建两个条目(两者都使用ParentPart = NULL)。 / p>
如果您严格不想添加这些条目,可以查看intereceptors and events。
我认为您无法在映射文件中解决此问题。 NHibernate映射功能不是为处理这种特定逻辑而设计的,也不应该这样做。
(在数据库中拥有这种逻辑可能不是很理想,但听起来这不是一个新项目,所以我们不需要在这里争论它。)