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