Usando Massive Insert obtengo DBNull cuando trato de get scope_identity ()

Tengo una tabla con una columna de identidad.
Usando Massive con código como este

var table = new Categories(); var newID = table.Insert(new {CategoryName = "Buck Fify Stuff", Description = "Things I like"}); 

entonces

 table.Scalar("select scope_identity()"); 

devuelve DBNull 🙁

¿Qué debo hacer diferente para get el valor de identidad insertado real?

La documentation de MSDN indica que SCOPE_IDENTITY :

"recupera los últimos valores de identidad que se generan en cualquier tabla en la session actual"

Al mirar el código fuente masivo , parece que cada llamada a Scalar() abre una nueva connection:

 /// <summary> /// Returns a single result /// </summary> public virtual object Scalar(string sql, params object[] args) { object result = null; using (var conn = OpenConnection()) { // <-- see this ... result = CreateCommand(sql, conn, args).ExecuteScalar(); } return result; } ... /// <summary> /// Returns and OpenConnection /// </summary> public virtual DbConnection OpenConnection() { var result = _factory.CreateConnection(); result.ConnectionString = ConnectionString; result.Open(); // <-- ...and this return result; } 

Por lo tanto, cada vez que está haciendo table.Scalar("select scope_identity()"); en realidad estás haciendo esto en una nueva connection (lo que significa una session / scope diferente).

Esto explica el resultado DBNull .

Pero como ya lo estás haciendo:

 var newID = table.Insert(...) 

es posible que desee inspeccionar el valor de newID después de que se inserta; Espero que encuentres algo bueno allí.

Al less, eso es lo que el código de Insert() me lleva a creer:

  public virtual dynamic Insert(object o) { var ex = o.ToExpando(); if (!IsValid(ex)) { throw new InvalidOperationException("Can't insert: " + String.Join("; ", Errors.ToArray())); } if (BeforeSave(ex)) { using (dynamic conn = OpenConnection()) { var cmd = CreateInsertCommand(ex); cmd.Connection = conn; cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT @@IDENTITY as newID"; ex.ID = cmd.ExecuteScalar(); Inserted(ex); } return ex; } else { return null; } }