2012-03-09 8 views
6

Vorrei che NHibernate generi guids per le entità solo se non sono impostate manualmente dall'utente o dall'applicazione. Fondamentalmente, quando si salvano oggetti con nuovo Guid() (tutti zeri), NHibernate dovrebbe generarne uno. Quando si salva un oggetto che ha una guida diversa da zero, dovrebbe invece usarlo.Generatore di guida di NHibernate se nuovo

È la mia unica opzione per scrivere il mio generatore?

modifica Gente, sono a conoscenza di "assegnato". Avrei dovuto specificare che ne ero consapevole. Dal momento che non fa quello che voglio che faccia, non è l'opzione che sto cercando. Scrivere il mio generatore è un'opzione che funziona, ma vorrei qualcos'altro. Sospetto che non ci sia nient'altro.

risposta

1

Hai provato a impostare l'attributo unsaved-value?

<id name="Id" column="Id" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"> 
    <generator class="guid.comb" /> 
</id> 

modificare ora ho capito la tua domanda completamente un'altra opzione invece di stendere il proprio generatore è quello di utilizzare

<generator class="assigned" /> 

Tuttavia non è possibile utilizzare SaveOrUpdate(). Invece devi esplicitamente specificare su NHibernate se l'oggetto deve essere salvato o aggiornato chiamando il metodo Save() o Update() dell'ISession. Inoltre avrai sempre bisogno di impostare il GUID manualmente su tutte le tue NUOVE entità. È un'opzione.

+0

No, non l'ho fatto. Non credo che funzionerebbe in quanto considererebbe un valore diverso da 0 come salvato. Quale potrebbe non essere. Dal momento che voglio creare personalmente una guida. Imposterò valori non 0 su Id. – wasabi

+0

Ah questo è diverso allora, la tua domanda non era chiara. – Rippo

+0

Accidenti. Pensavo di averlo chiarito abbastanza chiaramente. – wasabi

2

Il problema qui è che NH ha bisogno di sapere se l'oggetto è nuovo o se esiste già. Lo fa di solito impostando l'ID.

Se hai scritto il tuo generatore, non risolve il problema, perché viene chiamato solo se l'oggetto è nuovo.

  • È possibile utilizzare il generatore assigned.
  • È possibile utilizzare una colonna di versione per indicare se l'oggetto è nuovo. Non l'ho mai provato in questo modo, ma dovrebbe funzionare. NON avere alcuna indicazione per NH se l'oggetto è nuovo causa un bel po 'di problemi. Credimi.
  • Si potrebbe anche avere un numero intero come chiave primaria e il GUID come normale campo univoco.

ho whould generare l'ID della classe costruttore di

class Entity 
{ 
    Guid id; 

    Entity(Guid id = Guid.Empty) 
    { 
    if (id == Guid.Empty) this.id = Guid.NewGuid(); 
    else this.id = id; 
    } 
} 
+0

Non seguo. L'oggetto è nuovo. Voglio solo consentire al mio codice utente di impostare manualmente il valore Id, prima di chiamare Salva. Proprio come 'assegnato', tranne che ha bisogno di funzionare ANCHE se Id == Guid.Zero – wasabi

+0

Se si desidera assegnare l'ID nel codice utente, è necessario utilizzare "assegnato". Se vuoi creare un id quando il codice utente non lo assegna, fallo nel costruttore dell'oggetto. E 'così semplice. –

+0

Stefan, sarebbe, tranne che voglio fare entrambe le cose. – wasabi