1

次のシナリオがあります。エンティティのコンポーネントがありますが、同じテーブルに格納する代わりに、別のテーブルに格納する必要があります。この 2 つのテーブルの関係は、最大でも 1 対 1 (1-0:1) です。コンポーネント テーブルの ID は、メイン テーブルによって与えられます。値オブジェクトには ID がありません。さて、ドメイン モデルで Id を追加せずに、コンポーネントを自分のテーブルに格納するようにマップするにはどうすればよいでしょうか。

4

2 に答える 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 に答える