Question

Essentiellement, le titre de cette question explique l'essentiel de ce que j'essaie de faire, mais pour créer un exemple artificiel ...

J'ai un cours, appelez-le Employé. Un employé a un comportement IPaymentBehaviour ...

public class Employee 
{
  IPaymentBehaviour _paymentBehaviour;

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

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

}

Ceci correspond à une table de base de données telle que:

dbo.Employees
 - > EmployeeId (clé primaire)
 - > PaymentBehaviourId (clé étrangère de la table de recherche)
 - > Field1
 - > Field2
 - > Field3
 - > Field4

En fonction de la valeur de PaymentBehaviourId, je dois "injecter" une implémentation différente de IPaymentBehaviour dans l'objet Employee. Selon le type de comportement PaymentBei utilisé, les champs 1, 2, 3 ou 4 peuvent être nécessaires pour créer ce comportement.

Quelqu'un peut-il me dire comment cela serait mappé avec Fluent-NHibernate?

Était-ce utile?

La solution

Employés de la table

  • EmployeeId (clé primaire)
  • PaymentBehaviourId (clé étrangère à PaymentBehaviour)

table PaymentBehaviour

  • PaymentBehaviourId (pk)
  • type (discriminateur)
  • Champ1
  • Champ2
  • Champ3
  • Champ4

Classes

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; }
}

Je ne connais pas assez FluentNHibernate pour vous dire à quoi ça ressemble, mais en XML, vous le spécifieriez ainsi:

<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>

Autres conseils

NHibernate utilise le constructeur par défaut pour instancier des entités. Il existe cependant des solutions .

Je pense que je travaillerais comme ça:

  • Créez une construction par défaut sur le Objet employé, qui a un private modificateur d'accès, afin que NHibernate puisse reconstruire ces types
  • Créez un intercepteur dans lequel vous surchargez les méthodes appropriées (OnLoad je présume), dans lequel vous faites sûr que vous injectez le bon Implémentation de IPaymentBehaviour dans l'entité. (Peut-être que vous pouvez créer une interface 'IPaymentBehaviourInjectable' qui peut être mis en œuvre par l'employé classe (implémenter explicitement), donc que vous pouvez injecter le bon comportement dans l'entité ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top