我有以下场景:我有一个实体的组件,但不是将它存储在同一个表中,而是需要存储在一个单独的表中。这两个表之间的关系最多是一对一(1-0:1)。 组件表的id由主表给出,作为值对象,它没有标识。 现在我想知道如何在不在域模型中添加ID的情况下映射要存储在自己的表中的组件。
答案 0 :(得分:4)
有three main ways to map a one-to-one relationship:继承,one-to-one
和join
。我很确定所有这三个都可以配置为共享主键,而不必添加额外的主键列。在这种情况下,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对象中的字段。
如果该表被更多其他表引用,则必须创建自己的主键。
您需要一个主键才能至少加入表格。