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方法进行滚动,如果必须的话,稍后再重温这个。