代码之家  ›  专栏  ›  技术社区  ›  Chris Stavropoulos

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

  •  2
  • Chris Stavropoulos  · 技术社区  · 17 年前

    有没有办法让nhibernate允许我在childobjecttable中存储多个childobjects,但将它们引用回不同的parentobjects?还是必须为每个ParentObject类型创建单独的ChildObject类/表?

    我已经将其分解为以下内容,我正在尝试映射这些对象:

    public class ParentObjectA
    {
        public virtual Int64 Id { get; private set; }
    
        public virtual IDictionary<int, ChildObject> Children { get; private set; }
    }
    
    public class ParentObjectB
    {
        public virtual Int64 Id { get; private set; }
    
        public virtual IDictionary<int, ChildObject> 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)
    
    3 回复  |  直到 17 年前
        1
  •  1
  •   Ryan Duffield    17 年前

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

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

    这是所有可能与NHibernate的各种 inheritance models .

        2
  •  0
  •   Chris Stavropoulos    17 年前

    以下地图似乎从对象的角度工作。我不太热衷于使用交叉表的想法,但我认为这可能比尝试处理继承更干净。我也要看看这个选项,我会把我的发现贴在这里,以便完成。欢迎评论。

    ParentObjecta映射

    <map name="Children" table="ParentAxChildObject">
        <key column="ParentId" />
        <index column="ChildObjectNumber" type="Int32" />
        <many-to-many class="ChildObject" />
    </map>
    

    ParentObjectB映射

    <map name="Children" table="ParentBxChildObject">
        <key column="ParentId" />
        <index column="ChildObjectNumber" type="Int32" />
        <many-to-many class="ChildObject" />
    </map>
    

    这将生成以下交叉表:

    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,
    
        3
  •  0
  •   Chris Stavropoulos    17 年前

    我已经让继承版本以一个接口为基础工作,并希望将其发布在这里以便完成。

    public interface IParent
    {
        IList<Child> children { get; set; }
        void AddChild(Child child);
        Int64 Id { get; set; }
        Child GetChild();
    }
    
    public class Parent : IParent
    {
        public virtual IList<Child> children { get; set; }
    
        public Parent()
        {
            children = new List<Child>();
        }
    
        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<Child> children { get; set; }
    
        public Parent2()
        {
            children = new List<Child>();
        }
    
        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; }
    }
    

    它们映射为以下内容:

    <class name="IParent" table="IParents">
        <id name="Id" unsaved-value="0">
            <column name="Id" sql-type="bigint" />
            <generator class="hilo" />
        </id>
    
        <bag name="children" cascade="all">
            <key column="ParentId" />
            <one-to-many class="Child" />
        </bag>
    
        <joined-subclass name="Parent" table="Parents" >
            <key column="ParentId" />
        </joined-subclass>
    
        <joined-subclass name="Parent2" table="Parents2" >
            <key column="ParentId" />
        </joined-subclass>
    </class>
    
    <class name="Child" table="Children">
        <id name="Id" unsaved-value="0">
            <column name="Id" sql-type="bigint" />
            <generator class="hilo" />
        </id>
    </class>
    

    这将依次创建以下表:

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

    这里要注意的大“gotcha”是子对象只直接引用iparents表中的ID。parent或parent2对象的每个实例都绑定到iparent和parents或parents2之间的联合调用,这取决于您实际使用的派生对象类型。

    我还没有用一个具有多个接口的类来测试这个,但是我也需要测试它。

    关于继承模型,我不喜欢的是我需要一个公共的接口/基类。我不知道为什么我反对这种即兴的,它只是显得笨拙而已。

    我想我现在就开始使用交叉表方法,如果需要的话,稍后再重新讨论这个方法。