NHibernate复合元素映射代码



我正试图通过翻译"NHibernate in Action"中的示例来通过代码学习NHibernat映射,但其中一个示例出现了问题。我已经介绍了我试图翻译的XML以及我在翻译它时所做的努力。代码基本上在类别和项目之间有一种多对多的关系。它使用名为CategorizedItem的组件类来维护两个实体之间的关系。

我遇到的问题是,一旦我在lambda中声明了Category的Items属性,Item类的属性就是组件映射中唯一可供选择的属性。我想让映射知道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
})
);

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

您几乎做到了-在对组件的调用中,您需要设置组件的属性如何映射到关系表,即:

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);
})
);

最新更新