2010-06-16 116 views
0

我有一个独特的情况与遗留应用程序,我有一个基于两个整数值的父/子关系。不幸的是,这些字段是而不是 id和parentId或类似的东西。这些列是ItemId和SubItemId。当这两列彼此相等时,该项目被假定为父项。当它们不同时,ItemId引用Items父项,而SubItemId只是它的子项的标识符。NHibernate的奇怪关系映射问题

下面是一个例子 项目Id = 1,SubItemId = 1:父件 项目Id = 1,SubItemId = 6:子项,其父是Item其中ID字段是(1,1) 项目Id = 2 ,SubItemId = 2:父件 项目Id = 2,SubItemId = 9:子项,其父是Item其中ID字段是(2,2)

与此信息

所以,我一个类层次结构设置像这样:

public class Item 
    public property ItemId as Integer 
    public property SubItemId as Integer 
end class 

class ParentItem : Item 
end class 

class SubItem : Item 
    public property ParentItem as ParentItem 
end class 

所以我想映射SubItem cl的ParentItem属性屁股到相应的ParentItem使用NHibernate和我不能为我的生活弄清楚如何。我能够让NHibernate基于公式鉴别器实例化正确的类,并且我希望类似的东西可以用于多对一的关系。

我无法更改表格结构,这当然限制了我的选择。另外,我为我的映射使用FluentNHibernate,所以随意使用它的语法提供建议。

谢谢!

更新 我创建的补充,等同于一个外键指向父,现在我得到一个NHibernate的映射错误两个新列视图:

Foreign key (FK163E572EF90BD69A:ItemsNHibernateView [ParentItemID, ParentrSubitemID])) must have same number of columns as the referenced primary key (ItemsNHibernateView [ItemID, SubitemID]) 

这是扔我送行因为对我来说,它看起来像两个键具有相同的列数...

+0

我知道你说你不能改变表结构,但是你能够在数据库端创建一个视图来处理数据,然后它到达NHibernate? – 2010-06-16 22:09:01

+0

我不认为创建视图会是一个问题。 目前,我们已经有了用于创建和编辑这些项目的其他机制。我们只是希望将我们的物品表映射为支持其他物品的需求,并作为迈向更美好未来的第一步! ;) – Andorbal 2010-06-17 13:40:05

回答

1

好吧,我想出了基于本霍夫斯坦的评论。正如我在原始问题的更新中提到的那样,我创建了视图。错误是由一个令人毛骨悚然的愚蠢错误造成的。当我创建数组列出列名的外键,我把两个名字在引号像这样的:

new string() {"ParentItemID, ParentSubitemID"} 

代替:

new string() {"ParentItemID", "ParentSubitemID"} 

的方式,NHibernate的是显示错误把我从香味中扔出去了。