1

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

4

2 回答 2

4

映射一对一关系的主要方法有三种:继承one-to-one、、和join。我很确定所有这三个都可以配置为共享主键,而不必添加额外的主键列。在这种情况下,join听起来是最合适的,因为您不必创建单独的实体。 Ayende 的文章是理解的最佳资源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

于 2013-09-11T14:29:56.567 回答
0

如果具有值对象的表仅被一个表引用,您可以使用该表的主键作为主键,但不要使用任何方法访问值对象中的字段。

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

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

于 2013-09-11T13:32:30.953 回答