2011-05-26 19 views
13

Tengo una base de datos SQL Server. Esta base de datos tiene una tabla llamada Item. El artículo tiene una propiedad llamada "ID". ID es la clave principal en mi mesa. Esta clave principal es un entero con un valor de incremento de 1. Cuando intento para insertar el registro, recibo un error que dice:IDENTITY INSERT y LINQ to SQL

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

estoy intentando insertar registros usando el siguiente código:

public int AddItem(Item i) 
    { 
    try 
    { 
     int id = 0; 
     using (DatabaseContext context = new DatabaseContext()) 
     { 
     i.CreatedOn = DateTime.UtcNow; 
     context.Items.InsertOnSubmit(i); 
     context.SubmitChanges(); 
     id = i.ID; 
     } 
     return id; 
    } 
    catch (Exception e) 
    { 
     LogException(e); 
    } 
    } 

Cuando miro i.ID antes de enviarlo, noto que i.ID se establece en 0 . Lo que implicaría que estoy tratando de insertar 0 como la identidad. H sin embargo, no estoy seguro de lo que debería ser. ¿Alguien me puede ayudar?

Gracias!

+0

¿está seguro de que establece la columna como la clave principal en el DB y que sus clases generadas de Linq a Sql lo reflejan?Sé que a veces me olvido de marcar una columna como clave principal y mis clases generadas deben actualizarse. –

Respuesta

9

Parece simplemente que su modelo no tiene conocimiento de que es una identidad; la columna ID se debe marcar como db-generated (Auto Generated Value en la interfaz de usuario, o IsDbGenerated en el xml), y probablemente como la clave principal. Entonces no intentará insertarlo, y actualizará el valor correctamente después de que se haya escrito.

2

La ID será cero hasta que llame a context.SubmitChanges() ;. Examine el código y observe el valor después de invocar SubmitChanges. Recuerde, el DB realmente está asignando el ID (suponiendo que sea una tecla de incremento automático).

Tome un vistazo a esto:

Working with Entity Keys

7

Establecer el "auto generada" propiedad de la propiedad ID a "True".

0

Debe definir en su asignación que la ID se genera en la base de datos. La forma de hacerlo depende del tipo de asignación que esté utilizando. Si está utilizando atributos de código, asegúrese de especificar IsDbGenerated en el ColumnAttribute para la propiedad Id (o en el mapeo XML). Si está utilizando un archivo dbml, asegúrese de que el valor generado automáticamente esté establecido en verdadero.

6

Compruebe su propiedad ID dentro de la clase Item para asegurarse de que tiene los atributos de esta manera:

[Column(Storage="_ID", AutoSync=AutoSync.OnInsert, 
    DbType="INT NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] 

Mira el IsDbGenerated=true, es el hombre importante aquí.

Tal vez creado el DatabaseContext mediante el diseñador antes de ajustar el IDENTITY en el SQL Server, por lo que sólo regenerar esta clase (mediante la supresión de la tabla en el diseñador y soltar los archivos desde el Explorador de servidores de nuevo).

0

La forma más sencilla es: 1. dbml abierta 2. Seleccione la clase para insertar 3. Seleccione la columna con-clave principal Auto 4. cheque generado propiedad en la ventana de propiedades (se debe establecer en True)