sql server - ¿Cómo recuperar la identificación auto-incrementada en ServiceStack OrmLite?
sql-server ormlite-servicestack (3)
Para una tabla que tiene una identidad:
[AutoIncrement]
public int Id { get; set;}
Al insertar una nueva fila en la base de datos, ¿cuál es la mejor manera de recuperar el Id del objeto?
Por ejemplo:
db.Insert <> (nuevo usuario ());
El valor de la identificación es 0 después de la inserción, pero en la base de datos, obviamente, este no es el caso. La única posibilidad que puedo ver es la siguiente:
Id = (int)db.GetLastInsertId();
Sin embargo, no creo que esto sea una llamada segura para hacer. Si hay cientos de inserciones ocurriendo al mismo tiempo, se puede devolver una identificación para otra inserción. En EF, cuando realiza una inserción, el ID se establece para usted.
¿Alguien sabe la mejor manera de hacer esto?
Actualización: como se ve here , si está utilizando ServiceStack / ORMLite v4, debe utilizar la consulta parametrizada para obtener el ID insertado. Por ejemplo:
var UserId = db.Insert<User>(new User(), selectIdentity: true);
Definitivamente, debería usar el patrón de Unidad de trabajo, particularmente en estos escenarios, envuelve los códigos relacionados con db en un ámbito de transacción.
En ormLite, puede implementar esto a través de IDbCommand e IDbTransaction (vea el ejemplo aquí http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs )
Al observar el código, notará que será una codificación menos mágica y más manual, pero es una forma.
En ServiceStack.OrmLite v4, que utiliza de forma predeterminada consultas parametrizadas, hay un par de opciones en db.Save()
que rellena automáticamente el Id. De incremento automático, por ejemplo:
db.Save(item);
item.Id //populated with the auto-incremented id
De lo contrario, puede seleccionar la última identificación de inserción usando:
var itemId = db.Insert(item, selectIdentity:true);
Aquí hay más ejemplos que muestran las nuevas API de OrmLite .
Para OrmLite v3
La llamada correcta es db.GetLastInsertId()
que, por ejemplo, para SQL Server bajo el capó, llama a SELECT SCOPE_IDENTITY () que devuelve la última identificación insertada para esa conexión .
Esto es seguro porque todas las otras inserciones concurrentes que podrían estar ocurriendo están usando diferentes conexiones de base de datos. Para que cualquier otra persona pueda usar la misma conexión, debe ser eliminada y devuelta al grupo.