2012-06-23 124 views
22

Recibo este error en EF.Error de Entity Framework: No se puede insertar un valor explícito para la columna de identidad en la tabla

Cannot insert explicit value for identity column in table 'GroupMembers_New' when IDENTITY_INSERT is set to OFF.

La columna de la DB es incremento de identidad y en el archivo de diseño de EF, StoreGeneratedPattern es identity también. Parece que EF está intentando insertar 0 cada vez que intento guardar.

Algunas sugerencias dicen que la ID está reservada en las tablas o descarta la tabla y vuelve a ejecutar las secuencias de comandos.

¿Alguna idea?

Aquí hay algo de código:

GroupMember groupMember = new GroupMember(); 
      groupMember.GroupId = group.Id; 
      groupMember.UserId = (new UserId(group.Owner)); 
      //groupMember.Id = _groupContext.GroupMembers.Count(); 
      group.GroupMembers.Add(groupMember); 

      _groupContext.SaveChanges(); 

database

EF Designer

Respuesta

35

Me he encontrado esto antes. Este error significa que está intentando asignar un valor explícitamente a una columna donde la base de datos lo asigna automáticamente.

Sugerencia: Actualice su archivo edmx para reflejar cualquier cambio que pueda haber realizado en la base de datos. Si la base de datos asigna automáticamente el valor, debería ver el atributo "IsDbGenerated = true" en su archivo de diseñador bajo esa propiedad. Si no está allí, puede agregarlo manualmente.

+2

De hecho, actualizar el edmx fue la solución. Gracias –

+2

en ef5 en el diseñador de edmx hay una propiedad contra el campo llamado 'StoreGeneratedPatern' - establezca esto en 'Identity' – timothy

18

Prueba esto:

using System.ComponentModel.DataAnnotations.Schema; 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public decimal Identity_Col { get; set; } 

El archivo de clase Entity Framework añade estas líneas de código a la columna de identidad.

+2

Pero esto también genera la identificación. qué ocurre si quiero especificar el valor yo mismo y usarlo como la clave principal de la tabla. –

+0

Primero, utilizando el código EF Core, tengo una tabla con una clave compuesta, una columna es Identity. Agregar el atributo '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]' funcionó para mí. –

3

En EF 6, hay una propiedad del campo/columna en su modelo para hacer esto: StoreGeneratedPattern.

Establezca esto en "Identidad" en la lista desplegable de propiedades.

(no sé acerca de EF 4. La respuesta anterior, utilizando IsDbGenerated, parece ser para EF 4.)

lo que corresponde en el XML subyacente a un atributo al elemento:

<Property Name="MyTableId" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 

- pero no es necesario tratar el XML manualmente, ya que puede usar el diseñador.

No está claro cómo se ensucia esto. Tuve el problema incluso después de actualizar mi modelo de la base de datos. Quizás se confunda si configura el PK en la tabla, o cambia su nombre, después de que ya haya generado el modelo. (Estoy utilizando el método table/database-first, no código primero.)

No se puede utilizar el enfoque anterior de poner el atributo C# en el código de entidad, porque en esta situación el código de entidad es generado por EF . Se supone que EF comprende ("por sí mismo") que el campo es una identidad.

8

Ponga estos attribs en la parte superior de la propiedad, que es la identidad:

[Key] 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public int ID { get; set; } 
+0

Esto no parece funcionar con Azure Mobile Services. Tengo un modelo con esto como un campo: [Índice (IsClustered = true)] [DatabaseGenerated (DatabaseGeneratedOption.Identity)] [TableColumnAttribute (TableColumnType.CreatedAt)] DateTimeOffset público? CreatedAt {get; conjunto; } – WiteCastle

+2

Agregué el atributo, y ahora aparece este error: "Una propiedad dependiente en un ReferencialConstraint se asigna a una columna generada en la tienda" – Logar314159

+0

Esto funcionó perfectamente para mí. Gracias. –

3

Primer resultado en Google, por lo que aquí mi solución:

Código EF primera: Debido a 'id' un AutoInc campo de PK Y una columna guid, diseño como este:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid FileToken { get; set; } 

había una identidad duplicada. Lo cambié a:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
[DefaultValue("newid()")] 
public Guid FileToken { get; set; } 

y el problema desapareció.

Espero que te ayude.

Erik

+0

Primero, utilizando el código EF Core, tengo una tabla con una clave compuesta, una columna es Identity. Agregar el atributo '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]' funcionó para mí. –

0

tuve este problema en mi aplicación; y lo arreglé cambiando la propiedad "StoredGeneratedPattern" del campo id a Identity.

Así que, vaya al modelo; busca la mesa; haga clic en las propiedades del campo clave principal; y cambia la propiedad.

Cuestiones relacionadas