2011-08-03 25 views
5

Tengo una tabla en una base de datos SQL Server a la que deseo agregarle una fila. La clave principal no es un incremento automático y no quiero que sea así. Sin embargo, en esta ocasión, quiero agregar una fila con el siguiente valor disponible. ¿Hay una manera simple de hacer esto? Sé que podría consultar la tabla para obtener el valor máximo y luego aumentarla, pero ¿hay alguna manera más fácil al usar EF?.NET Entity Framework Agregar nueva fila con clave primaria incremental

Si es necesaria una consulta por separado para obtener el valor MAX, ¿cómo lo haría con LINQ?

Respuesta

5

Sería necesario a menos que el servidor sea una columna de identidad o computada, en tal caso podría hacer algo como a continuación.

myRecord.ID = Context.Records.Max(record => record.ID) + 1; 
+1

Gracias que funcionó. – Jonnster

3

No hay una manera fácil de hacerlo, especialmente si insistes en el siguiente valor disponible (= no hay espacios). Debe usar el valor de incremento automático y hará que su aplicación funcione mucho mejor.

¿Cuál es el problema?

  1. que necesita para obtener un valor de la base de datos de
  2. Es necesario asignar a su entidad
  3. Es necesario para salvar la entidad a la base de datos

parece fácil, no es ¿eso? No, no lo es si tiene un entorno concurrente donde más de un subproceso puede hacer el paso 1. al mismo tiempo antes de que otros subprocesos lleguen al paso 3. = todos los subprocesos insertan el registro con el mismo valor.

¿Cómo manejarlo? Una forma es usar una tabla separada con valor máximo y operación atómica para obtener e incrementar el valor. Creo procedimiento almacenado hacer algo como esto debe ser atómica:

DECLARE @Result INT 
UPDATE SequenceTable SET @Result = MaxValue = MaxValue + 1 WHERE SequnceName = '...' 
RETURN @Result 

La llamada al procedimiento almacenado debe estar fuera de cualquier transacción para hacer el mejor rendimiento.

Esto debería permitirle generar números únicos pero sin secuencia sin espacios. Si toma el valor con dicha operación y no usará ese valor, se perderá y su secuencia contendrá la brecha.

Si no desea la separación, debe poner la operación del procedimiento almacenado y la operación en la transacción para que la tabla de registro en secuencia se bloquee hasta que se confirmen los datos.

Cuestiones relacionadas