質問

本質的にこの質問のタイトルは、私がやろうとしていることの本質を説明していますが、不自然な例を作成しています...

クラスがあり、それをEmployeeと呼びます。従業員にはIPaymentBehaviourがあります...

public class Employee 
{
  IPaymentBehaviour _paymentBehaviour;

  protected internal Employee() { /* required by NH */}

  public Employee(IPaymentBehaviour paymentBehaviour)
  {
    _paymentBehaviour = paymentBehaviour;
  }

}

これは次のようなデータベーステーブルに対応します。

dbo.Employees
 -> EmployeeId(主キー)
 -> PaymentBehaviourId(ルックアップテーブルへの外部キー)
 -> Field1
 -> Field2
 -> Field3
 -> Field4

PaymentBehaviourIdの値に応じて、IPaymentBehaviourの異なる実装をEmployeeオブジェクトに「注入」する必要があります。使用されているPaymentBehaviourに応じて、その動作を作成するにはField1、2、3、または4が必要になる場合があります。

Fluent-NHibernateを使用してこれがどのようにマップされるか教えていただけますか?

役に立ちましたか?

解決

table Employees

  • EmployeeId(主キー)
  • PaymentBehaviourId(PaymentBehaviourの外部キー)

table PaymentBehaviour

  • PaymentBehaviourId(pk)
  • type(discriminator)
  • Field1
  • Field2
  • Field3
  • Field4

クラス

public class Employee 
{
  /* ... */  
  public PaymentBehaviour PaymentBehaviour { get; set; }
}

public class PaymentBehaviourA : IPaymentBehaviour
{
  /* ... */  
  public int Field1 { get; set; }
}

public class PaymentBehaviourB : IPaymentBehaviour
{
  /* ... */  
  public int Field2 { get; set; }
}

FluentNHibernateがどのように見えるかを十分に理解していませんが、XMLでは次のように指定します。

<class name="Employee" table="Employees">
  <many-to-one name="PaymentBehaviour" class="IPaymentBehaviour">
</class>

<class name="IPaymentBehaviour" abstract="true" >
  <discriminator column="type"/>

  <subclass name="PaymentBehaviourA" discriminator-value="A">
    <propert name="Field1"/>
  </subclass>

  <subclass name="PaymentBehaviourB" discriminator-value="B">
    <propert name="Field2"/>
  </subclass>
</class>

他のヒント

NHibernateは、デフォルトのコンストラクターを使用してエンティティをインスタンス化します。ただし、いくつかの回避策があります。

次のように回避すると思います:

  • でデフォルトの構造を作成します 従業員オブジェクト NHibernateがこれらのタイプを再構築できるように、 private アクセス修飾子
  • 適切なメソッドをオーバーロードする場所でインターセプターを作成します (OnLoad私は推測する)、あなたが作る あなたが正しい注入することを確認してください IPaymentBehaviour の実装 エンティティに。 (おそらくできる インターフェースを作成する 「IPaymentBehaviourInjectable」という 従業員が実装できます クラス(明示的に実装) あなたが正しいを注入できること エンティティへの振る舞い...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top