2009-06-15 18 views
9

È possibile eseguire una mappatura in NHibernate senza utilizzare un ID?Mappatura NHibernate senza ID

Quello che sto cercando di fare è, chiamare una stored procedure utilizzando

session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity)); 

La procedura è un aggregato e non c'è campo Id essere restituito, ma mi piace ancora di approfittare di mappatura NHibernate i dati restituiti in un'entità. L'unica cosa che ho scoperto finora è che la procedura aggiunga un campo "O come Id" o qualcosa del genere e che l'entità abbia un campo di identificazione fittizio.

risposta

3

Ho trovato che questo non è possibile. Anche i dati restituiti dalla stored procedure devono avere un ID. Ha funzionato solo per creare una colonna fittizia con un ID e una proprietà fittizia sull'oggetto, ma ho appena deciso di convertire i dati restituiti da NHibernate a un oggetto a mano.

Fondamentalmente, non è necessario utilizzare stored procedure con NHibernate. È un ORM dopotutto. Nel mio caso, non ho avuto altra scelta che usare la procedura.

0

Ho bisogno di ricontrollare il xsd, ma credo che siano necessari id o ID composito. Tuttavia, per i documenti, il nome non è richiesto. Quindi, dovresti essere in grado di specificare una sezione id quasi bianca.

In una situazione simile, ho impostato la classe su mutable = "false" e mappato l'id sull'indice di riga e impostato il generatore nella mappatura id su assegnato.

+1

Okay - domanda stupida. Come si fa a mappare l'indice di riga? Che aspetto ha nel file di mappatura? Abbiamo cercato questo nella documentazione e abbiamo deciso di chiedere. – ferventcoder

4

L'entità deve essere "univoca" in qualche modo, anche se non ha un campo ID.

decidere quali proprietà, nel loro insieme, deve essere unico, e utilizzare una chiave composta su di loro ...

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 
0

Dal post di @Andy McCluggage:

Si può molto fare questo in la mappatura:

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 

Ma, è necessario sovrascrivere equals() e GetHashCode() nel modello:

public class MyClass 
{ 
    public virtual DateTime Property1; 
    public virtual string Property2; 
    public virtual int SomeOtherProperty; 

    public override bool Equals(object obj) 
    { 
     if(obj == null) 
      return false; 

     var t = obj as MyClass; 

     if(t == null) 
      return false; 

     if (this.Property1 == t.Property1 && this.Property2 == t.Property2) 
      return true; 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return (this.Property1 + "|" + this.Property2).GetHashCode(); 
    } 
} 
Problemi correlati