2010-05-17 36 views
10

Tengo una aplicación web MVC con una tabla en el modelo que me gustaría agregar. Tengo la clave principal establecida junto con los otros campos de datos, pero cada vez que intento agregar a la tabla, aparece el siguiente error:IDENTITY_INSERT está configurado en off error

"No se puede insertar un valor explícito para la columna de identidad en la tabla 'TABLE_NAME' cuando IDENTITY_INSERT es establecer en OFF ".

No estoy seguro de por qué aparece este problema, tengo la clave principal establecida como la identidad y también está configurado para aumentar automáticamente en el diseñador de tablas de Visual Studio. ¿Hay alguna manera de que pueda ajustar el parámetro IDENTITY_INSERT en el diseñador de tablas en Visual Studio? O hay algún otro problema que podría estar causando esto.

ACTUALIZACIÓN: @Brian - Por lo que puedo decir, no estoy estableciendo el valor explícitamente, aquí está el código que se agrega a la tabla (s).

//Add viewer 
public void addViewer(ModelStateDictionary modelState, Users user) 
{ 
    var userToAdd = new UserRoles(); 
    userToAdd.Users = user; 

    if (String.IsNullOrEmpty(userToAdd.Users.Username)) 
    { 
     modelState.AddModelError("noName", "Please enter a username for the new Viewer"); 
    } 

    //See if Committee Member already exists 
    try 
    { 
     userToAdd = _db.UserRoles.First(ur => ur.Users.Username == userToAdd.Users.Username); 
     modelState.AddModelError("userExists", "A Viewer with that username already exists in the system"); 
     return; 
    } 
    catch (Exception e) 
    { 
     if (modelState.IsValid) 
     { 
      //Assign Committee Member role 
      userToAdd.Role = "Viewer"; 
      userToAdd.Users = user; 
      //Add new Committee Member to User Roles and associated username to Users 
      _db.AddToUserRoles(userToAdd); 
      _db.SaveChanges(); 
     } 
    } 
} 
+0

verifica la configuracion/propiedades en la tabla en cuestión en su diseñador de LINQ a SQL - es necesario asegurarse de ciertos ajustes específicos - vea mi respuesta para más detalles. –

+0

Acabo de editar el '* .edmx' para cambiar el valor correspondiente a mi clave principal de' 'a' '. Simplemente estaba agregando el atributo con su valor: 'StoreGeneratedPattern =" Identity "'. –

Respuesta

5

Está intentando establecer un valor de clave primaria explícitamente probablemente en la entidad LINQ posiblemente; está tratando de decir, por ejemplo, inserte 1 en el campo de clave primaria que es una identidad, y LINQ ve esto como un valor insertado.

Además, si usa LINQ to SQL, en el tipo de datos del servidor del campo, asegúrese de que indique IDENTIDAD en el campo de tipo de datos; si no dice IDENTIDAD, puede haber un error de configuración en LINQ.

+0

+1 Esto es lo que quería hacer. =) (Language barrier =() –

+0

Estoy usando LINQ-to-Entities para mi modelo. – kingrichard2005

+0

StoreGeneratedPattern debería decir Identity for LINQ to Entities, al menos para 4.0. No usé 1.0 mucho. –

14

Parece que su código está tratando de insertar un valor específico en la columna de la clave principal que se define como IDENTIDAD.

Para evitar el error, ¡no inserte ningún valor! Deje que la base de datos maneje obteniendo un nuevo valor para la fila que está insertando.

Si está utilizando LINQ to SQL, haga clic en la tabla en cuestión en su diseñador visual, y echar un vistazo a las propiedades:

alt text http://i39.tinypic.com/bgzs6d.png

El "Valor Auto Generado" debe ser "True" (que no es el valor predeterminado), y la sincronización automática debe ser "OnInsert" (de nuevo: no es el valor predeterminado). Además, configure la "Clave principal" en verdadero y verifique que el "Tipo de datos del servidor" sea correcto: Int NOT NULL IDENTITY (o algo así).

Si alguna vez necesita anular el comportamiento predeterminado (generalmente solo en scripts de limpieza o manipulaciones de datos únicos), puede ACTIVAR el IDENTITY_INSERT en una tabla, p. Después de eso, puede insertar cualquier valor que usted tiene gusto en la columna IDENTITY:

SET IDENTITY_INSERT YourTableName ON 

INSERT INTO YourTableName(IdentityColumn) VALUES(5555) 

SET IDENTITY_INSERT YourTableName OFF 

Esto es más de un tipo de administrador de limpieza/datos de la tarea - no es algo que debe hacer todo el tiempo como un prog.

+0

Intenté bien Al hacer clic en la tabla del diseñador del estudio de administración del servidor mssql, no vi nada parecido a lo que hiciste. Ejecuté la consulta para activar el inserto de identidad, pero eso no ayudó a que mi código se insertara programáticamente. – obesechicken13

+0

Intenté esto de nuevo en el estudio visual . No veo opciones para "clave principal" solo "clave de entidad". Veo tipo. No veo ninguno de los otros parámetros en negrita que ve. – obesechicken13

4

Gracias a todos por sus sugerencias, terminé solucionando mi problema al actualizar el modelo. Mi modelo se había creado antes de configurar la clave principal para la especificación de Identidad con autoincremento, así que supongo que todo lo que necesitaba era una actualización para ponerlo en funcionamiento.

0

Tuve este problema y lo resolví quitando la columna de identidad del modelo. Eso lo limpió directamente

1

Si está utilizando LinQ a SQL. Simplemente elimine su tabla del archivo .edmx haciendo clic derecho en la tabla y seleccionando la opción "Eliminar del modelo". y luego Actualice su archivo .edmx haciendo clic derecho en el archivo .edmx y seleccionando la opción "Actualizar el modelo desde la base de datos ...".

su labor en me..Try ella ..

Cuestiones relacionadas