5

Estoy utilizando una conexión Entity Framework 4 para conectarme a un servidor SQL 2008 para gestionar la base de datos de mi aplicación.¿Cómo puedo obtener la siguiente clave principal para SQL 2008 en Entity Framework 4

Estoy usando C# en Visual Studio 2010 y mi pregunta es con respecto a los campos de clave primaria que se incrementan por el SQL en sí, ¿es posible para mí encontrar la ID que utilizará la base de datos? .

La razón por la que no puedo encontrar el último elemento y +1 es porque si mi tabla contiene los elementos 1, 2, 3, 4 y 5, eliminar el elemento 5 y luego agregar otro hará que el siguiente elemento se convierta en el elemento 6 más de 5 (como uso la especificación de identidad en SQL, pero esto debe usarse).

No puedo encontrar ningún método como Item.ID.GetNextIdentity() o algo así y he examinado tantas preguntas similares como esta, pero fue en vano.

Cualquier ayuda se agradece

+0

¿No fue útil? http://stackoverflow.com/questions/2958921/entity-framework-4-how-to-find-the-primary-key –

+0

@Chris, lo miré mientras estaba buscando y no mencionó nada sobre el siguiente clave, la pregunta y la respuesta me parecieron que estaban hablando de encontrar el campo que es la clave principal, no la siguiente clave principal que se usará en el campo. – JakeJ

+3

¿Qué vas a hacer con la próxima identificación? Incluso si encuentra una manera de obtenerlo, no puede estar seguro de que ** usted ** tenga la identificación. –

Respuesta

9

No hay una manera confiable de usar ID incrementado automáticamente y mostrarlo en un formulario antes de guardar. Esa es la arquitectura equivocada. Si usted quiere tener ID muestra antes de guardar el formulario debe:

  • No utilizar Auto columna incrementado como identificación y el mango mismos singularidad
  • guardar el formulario de inmediato cuando el usuario comienza a crear en un estado vacío inicial y la confirmación del formulario final solo actualizará

¿Por qué no puede solicitar la próxima identificación? Porque si lo haces de alguna manera nadie dice que la ID recibida se usará realmente para tu formulario. Si otro proceso/subproceso/aplicación inserta un formulario entre su recuperación de ID y la persistencia de su formulario, el ID que usted muestra será asignado a ese formulario insertado.

Además, si usa claves primarias autoincorporadas en la base de datos, no puede asignar el valor de la clave en su aplicación; el valor no se utilizará y la base de datos puede anularlo con las suyas propias.

-1

DBCC CHECKIDENT (table_name, NORESEED)

Devuelve el valor de identidad actual y el valor máximo actual de la columna de identidad.

+0

Necesito hacer el comando y usar el valor devuelto en el lado C# de En mi aplicación con Entity Framework 4, parece que ese comando se debe hacer en la consulta SQL, no en Entity Framework. Si puedo hacerlo a través de Entity Framework 4, no sé cómo me lo tendrá que decir. – JakeJ

+0

Eso no funcionaría en condiciones de carrera. – HLGEM

0

De acuerdo con Ladislav Mrnka, sin embargo, este tipo de funcionalidad podría ser necesaria. Una sugerencia de derivación sería:

 // Insert existing object in data base via EF, but PK is missing ... 
     using (var Es = new MyEntities()) 
     { 
      try 
      { 
       // Allows you to get next pk 
       var e = new Model.TableXXX(); 
       // Set pk to existing entity which has no pk 
       existingEntity.PkField = e.PkField; 
       // Save existing object and let garbage collector take care 
       // of newly created entity 
       Es.TableXXX.AddObject(existingEntity); 
       Es.SaveChanges(); 
      } 
      catch (Exception ex) 
      { 
       // implement exception 
      } 
     } 
Cuestiones relacionadas