Domanda

Essenzialmente il titolo di questa domanda spiega l'essenza di ciò che sto cercando di fare, ma per creare un esempio inventato ...

Ho un corso, chiamalo Dipendente. Il dipendente ha un comportamento di pagamento IP ...

public class Employee 
{
  IPaymentBehaviour _paymentBehaviour;

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

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

}

Ciò corrisponde a una tabella di database in questo modo:

dbo.Employees
 - > EmployeeId (chiave primaria)
 - > PaymentBehaviourId (chiave esterna per la tabella di ricerca)
 - > Field1
 - > Field2
 - > field3
 - > Campo4

A seconda del valore di PaymentBehaviourId ho bisogno di 'iniettare' una diversa implementazione di IPaymentBehaviour nell'oggetto Employee. A seconda del pagamento utilizzato, potrebbe essere necessario Field1, 2, 3 o 4 per creare quel comportamento.

Qualcuno può dirmi come sarebbe mappato usando Fluent-NHibernate?

È stato utile?

Soluzione

tabella Dipendenti

  • EmployeeId (chiave primaria)
  • PaymentBehaviourId (chiave esterna per PaymentBehaviour)

tabella PaymentBehaviour

  • PaymentBehaviourId (pk)
  • tipo (discriminatore)
  • Field1
  • Field2
  • Field3
  • Campo4

Corsi

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

Non conosco FluentNHibernate abbastanza per dirti come appare, ma in XML lo specificheresti in questo modo:

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

Altri suggerimenti

NHibernate utilizza il costruttore predefinito per istanziare le entità. Ci sono comunque alcune soluzioni alternative.

Penso che vorrei aggirare il problema in questo modo:

  • Crea un costruttore predefinito sul Oggetto dipendente, che ha un modificatore di accesso privato , in modo che NHibernate possa ricostruire quei tipi
  • Crea un intercettore in cui sovraccarichi i metodi appropriati (OnLoad presumo), in cui fai sicuro di aver iniettato il corretto Implementazione IPaymentBehaviour nell'entità. (Forse puoi creare un'interfaccia 'IPaymentBehaviourInjectable' quello può essere implementato dal Dipendente classe (implementala esplicitamente), quindi che puoi iniettare il corretto comportamento nell'entità ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top