5

Estoy tratando de cambiar la identidad de insertar mi propio valor, pasos que siguieronNo se puede insertar valor personalizado en la columna de identidad - Marco de la entidad

  1. cambió el StoredGeneratedPattern valor de la propiedad a None para la columna de identidad
  2. StoredGeneratedPattern cambió el valor de la propiedad a None en el archivo EDMX abriendo en formato XML

intentado usar el código de abajo

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    int k = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client ON"); 
    Context.ClientInfoes.Add(testclient); 
    result = Context.SaveChanges(); 
    int j = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client OFF"); 
    scope.Complete(); 
} 

pero todavía estoy recibiendo el error

No se puede insertar valor explícito para la columna de identidad en la mesa cuando IDENTITY_INSERT se establece en OFF

Me estoy perdiendo algo? ¿Hay más opciones?

+0

su contexto dice ClientInfoes, pero tu SQL es dbo.client. ¿ClientInfoes se asigna al cliente? o una mesa clientinfoes? –

+0

Clientinfoes asigna al cliente, el cliente es la tabla en sql. Sin la identidad, el inserto funciona bien, pero mi requisito es pasar el ID de cliente personalizado. – Vamsi

Respuesta

0

Los datos se almacenan en la base de datos cuando se llama a TransactionScope.Complete, no cuando se llama a ClientInfoes.Add o Context.SaveChanges. Entonces puede ver que cuando se llama a la instrucción de inserción, ya ha desactivado IDENTITY INSERT.

simplemente reorganizar las cosas ...

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    int k = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client ON"); 
    Context.ClientInfoes.Add(testclient); 
    result = Context.SaveChanges(); 
    scope.Complete(); 
    int j = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client OFF"); 
} 

Mejor aún, hacer todos los cambios realizados IDENTITY_INSERT fuera de la transacción, ya que su valor es sesión específica (sólo se puede tenerlo encendido durante una mesa por sesión) .

0

Ver la misma pregunta here.

Eranga explica:

ExecuteSqlCommand se abrirá la conexión, ejecute el SQL y luego cerrarla. Entonces su próximo comando se ejecutará usando una conexión diferente .

El método ExecuteSqlCommand es similar al ExecuteStoreCommand.

Daniel Liuzzi explica:

... el truco está empacando todo en un solo comando ...

Así, por ejemplo,

string sqlStatement = "SET IDENTITY_INSERT clientInfo ON;" + 
string.Format("INSERT clientInfo (ClientInfoId, Column1, Column2) VALUES ({0}, {1}, {2}, '{3}');", testClient.ClientInfoId, testClient.Column1, testclient.Column2) + 
"SET IDENTITY_INSERT clientInfo OFF"; 
context.ExecuteStoreCommand(sqlStatement); 
+1

Usted rally desea eliminar ese 'string.Format' y parametrizar correctamente su comando; de lo contrario, te expones a ataques de inyección SQL. –

Cuestiones relacionadas