次のシナリオがあります。エンティティのコンポーネントがありますが、同じテーブルに格納する代わりに、別のテーブルに格納する必要があります。この 2 つのテーブルの関係は、最大でも 1 対 1 (1-0:1) です。コンポーネント テーブルの ID は、メイン テーブルによって与えられます。値オブジェクトには ID がありません。さて、ドメイン モデルで Id を追加せずに、コンポーネントを自分のテーブルに格納するようにマップするにはどうすればよいでしょうか。
質問する
633 次
2 に答える
4
1 対 1 の関係をマッピングする主な方法は、継承、one-to-one
、およびの 3 つjoin
です。主キー列を追加する代わりに、これら 3 つすべてが主キーを共有するように構成できると確信しています。この場合、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
値オブジェクトを持つテーブルが 1 つのテーブルによってのみ参照される場合、そのテーブルの主キーを主キーとして使用できますが、値オブジェクトのフィールドにアクセスするメソッドを作成しないでください。
テーブルが他のテーブルから参照されている場合は、独自の主キーを作成する必要があります。
少なくともテーブルを結合するには主キーが必要です。
于 2013-09-11T13:32:30.953 に答える