2013-01-13 12 views
19

Per una tabella che ha un'identità:Come recuperare l'identificazione auto-incrementata in ServiceStack OrmLite?

[AutoIncrement] 
    public int Id { get; set;} 

Quando si inserisce una nuova riga nel database, qual è il modo migliore per recuperare l'ID dell'oggetto?

Ad esempio:

db.Insert <> (nuovo utente());

Il valore dell'Id è 0 dopo l'inserimento, ma nel database questo ovviamente non è il caso. L'unica possibilità che posso vedere è la seguente:

Id = (int)db.GetLastInsertId(); 

Tuttavia, non credo che sarebbe una chiamata sicura da fare. Se ci sono 100 di inserimenti che si verificano nello stesso momento, può essere restituito un ID per un altro inserto. In EF quando fai un inserimento l'Id è impostato per te.

Qualcuno conosce il modo migliore per farlo?

risposta

26

In ServiceStack.OrmLite v4 che per impostazione predefinita utilizzando query con parametri ci sono un paio di opzioni in db.Save() che popola automaticamente l'AutoIncrement Id, ad esempio:

db.Save(item); 
item.Id //populated with the auto-incremented id 

In caso contrario è possibile selezionare l'ultimo inserto id utilizzando :

var itemId = db.Insert(item, selectIdentity:true); 

Qui ci sono more examples showcasing OrmLite's new API's.


Per OrmLite v3

La chiamata è corretta db.GetLastInsertId() che per SQL Server sotto il cofano per esempio chiama SELECT SCOPE_IDENTITY() che restituisce l'ultimo ID inserito per tale collegamento .

Questo è sicuro perché tutti gli altri inserimenti simultanei che potrebbero verificarsi stanno utilizzando connessioni DB diverse. Affinché qualcun altro possa utilizzare la stessa connessione, deve essere smaltito e rilasciato nuovamente nel pool.

+0

Oh quindi è per connessione! Ora ha molto più senso. – Dylan

+0

Grazie per il chiarimento su v3! db.GetLastInsertId() non sembra funzionare però perché è un metodo nascosto, penso ... qualsiasi suggerimento? – theoutlander

2

Si deve assolutamente utilizzare il modello Unità di lavoro, in particolare in questi scenari, si avvolgono i codici relativi a DB in ambito di transazione.

In ormLite, è possibile implementare questa via IDbCommand e IDbTransaction (vedi esempio qui http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs)

Guardando il codice, si noterà che sta per essere codifica meno magico e più manuale, ma è un modo.

+0

Leggere l'unità di lavoro e osservare la sorgente di esempio. – Dylan

2

Aggiornamento: come visto here, se si utilizza ServiceStack/ORMLite v4, è necessario utilizzare la query con parametri per ottenere l'ID inserito. Ad esempio:

var UserId = db.Insert<User>(new User(), selectIdentity: true); 
Problemi correlati