如何使用Fluent NHibernate在自己的表中映射值对象?

时间:2013-04-23 22:30:12

标签: nhibernate fluent-nhibernate-mapping

我有以下场景:我有一个实体的组件,但不是将它存储在同一个表中,而是需要存储在一个单独的表中。这两个表之间的关系最多是一对一(1-0:1)。 组件表的id由主表给出,作为值对象,它没有标识。 现在我想知道如何在不在域模型中添加ID的情况下映射要存储在自己的表中的组件。

2 个答案:

答案 0 :(得分:4)

three main ways to map a one-to-one relationship:继承,one-to-onejoin。我很确定所有这三个都可以配置为共享主键,而不必添加额外的主键列。在这种情况下,join听起来最合适,因为您不必创建单独的实体。 Ayende's article是理解join的最佳资源。

示例(来自Ayende的文章,但添加了一个组件):

<class name="Person"
       table="People">

  <id name="Id">
    <generator class="identity"/>
  </id>
  <property name="Name" />

  <join table="Addresses">
    <key column="PersonId"/>
    <component name="Address"
               class="Address">
      <property name="Line1"/>
      <property name="Line2"/>
      <property name="City"/>
      <property name="Country"/>
      <property name="ZipCode"/>
    </component>
  </join>
</class>

这个类看起来像:

public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Address Address { get; set; }
}

public class Address
{
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
    public string ZipCode { get; set; }
}

请注意,Address没有Id属性,并且它的属性不是虚拟的。这是因为Address不是实体,它是一个组件。但是join允许它与Person的其他属性分开存放。

答案 1 :(得分:0)

如果带有value对象的表仅由一个表引用,则可以将该表的主键用作主键,但不要使用任何方法来访问value对象中的字段。

如果该表被更多其他表引用,则必须创建自己的主键。

您需要一个主键才能至少加入表格。