NHibernate复合元素按代码映射

时间:2012-10-01 12:23:36

标签: nhibernate nhibernate-mapping mapping-by-code

我正在尝试通过翻译'NHibernate in Action'中的示例来学习NHibernate映射,并且我遇到了其中一个示例的问题。我已经包含了我正在尝试翻译的XML以及我翻译它的努力。代码在类别和项目之间基本上具有多对多的关系。它使用名为CategorizedItem的组件类来维护两个实体之间的关系。

我遇到的问题是,一旦我在lambda中声明了Category的Items属性,Item Class的属性就是组件映射中唯一可供选择的属性。我想让映射知道CategorizedItem的属性是要在关系中映射的属性,但是我不知道如何实现它。下面是我试图翻译的XML ......

<set name="Items" table="CATEGORY_ITEM" lazy="true" >
  <key column="CATEGORY_ID"/>
  <composite-element class="CategorizedItem">
    <parent name="Category"/>
    <many-to-one name="Item" class="Item" column="ITEM_ID" not-null="true"/>
    <many-to-one name="User" class="User" column="USER_ID" not-null="true"/>
    <property name="DateAdded" column="DATE_ADDED" not-null="true"/>
  </composite-element>
</set>

......这是我部分完成的映射。

Set(
    category => category.Items,
    map =>
    {
      map.Key(key =>
        {
          key.Column("CATEGORY_ID");

        });
      map.Table("CATEGORY_ITEM");
      map.Lazy(CollectionLazy.Lazy);
    },
    r => r.Component(m =>
    {
      m.Class

    })
  );

组件的class属性看起来像是可能的目标,但它拒绝将CategorizedItem作为类型参数。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

你几乎就在那里 - 在调用组件时,你需要设置组件的属性如何映射到关系表,即:

        Set(
            category => category.Items,
            map =>
                {
                    map.Key(key =>
                                {
                                    key.Column("CATEGORY_ID");

                                });
                    map.Table("CATEGORY_ITEM");
                    map.Lazy(CollectionLazy.Lazy);
                },
            r => r.Component(
                m =>
                    {
                        m.Parent(ci => ci.Parent);
                        m.ManyToOne(ci => ci.Item, r2 => r2.Column("ITEM_ID"));
                        m.ManyToOne(ci => ci.User, r2 => r2.Column("USER_ID"));
                        m.Property(ci => ci.DateAdded);
                    })
            );