NHibernate:如何将多个父母的普通类型的孩子映射到一个表中?

有没有办法让NHibernate让我在ChildObjectTable中存储多个ChildObjects,但是将它们引回到不同的ParentObjects? 或者我是否必须为每个ParentObject类型创建单独的ChildObject类/表?

我把它归结为以下内容,我正在尝试映射这些对象:

public class ParentObjectA { public virtual Int64 Id { get; private set; } public virtual IDictionary Children { get; private set; } } public class ParentObjectB { public virtual Int64 Id { get; private set; } public virtual IDictionary Children { get; private set; } } public class ChildObject { public virtual Int64 Id { get; private set; } } 

进入下表结构:

 ParentObjectTableA Id bigint ParentObjectTableB Id bigint ChildObjectTable Id bigint ParentId bigint ParentQualifier varchar(50) 

也许您可以为父类创建一个抽象基类? 这样,给定的子对象可以引用其父对象的抽象类型。

例如,您可以拥有一个名为ParentBase的类,ParentClassA和ParentClassB可以扩展。 您的子对象将具有对ParentBase的引用。

NHibernate的各种inheritance模型都可以实现这一切。

以下映射似乎从对象的角度来看。 我并不过分热衷于使用crosstables的想法,但我认为这可能比尝试处理inheritance更干净。 我也将看看这个选项,为了完成,我会在这里发布我的发现。 欢迎评论。

ParentObjectA的映射

      

ParentObjectB的映射

      

这些生成以下交叉表:

 ParentAxChildObject [ParentId] [bigint] NOT NULL, [elt] [bigint] NOT NULL, [ChildObjectNumber] [int] NOT NULL, ParentBxChildObject [ParentId] [bigint] NOT NULL, [elt] [bigint] NOT NULL, [ChildObjectNumber] [int] NOT NULL, 

我有inheritance版本,并以接口为基础,并希望在此处发布完成。

 public interface IParent { IList children { get; set; } void AddChild(Child child); Int64 Id { get; set; } Child GetChild(); } public class Parent : IParent { public virtual IList children { get; set; } public Parent() { children = new List(); } public virtual void AddChild(Child child) { children.Add( new Child() ); } public virtual Int64 Id { get; set; } public virtual Child GetChild() { return children.First(); } } public class Parent2 : IParent { public virtual IList children { get; set; } public Parent2() { children = new List(); } public virtual void AddChild(Child child) { children.Add(new Child()); } public virtual Int64 Id { get; set; } public virtual Child GetChild() { return children.First(); } } public class Child { public virtual Int64 Id { get; private set; } } 

这些映射如下:

                       

这反过来创建以下表:

 IParents Id bigint Parents ParentId bigint Parents2 ParentId bigint Children Id bigint ParentId bigint 

这里要注意的一个重要问题是,Child对象仅直接引用IParents表中的Id。 并且Parent或Parent2对象的每个实例都绑定到IParents与Parents或Parents2之间的联接调用,具体取决于您实际使用的派生对象类型。

我没有使用具有多个接口的类测试它,但我也需要测试它。

我不喜欢inheritance模型的事情是我需要一个通用的接口/基类。 我不确定为什么我反对这种反击,它看起来很笨重。

我想我现在要使用crosstable方法进行滚动,如果必须的话,稍后再重温这个。