Autonumerar con Entity Framework

Quiero recorrer una colección de objetos y agregarlos a una tabla. La tabla de destino tiene un campo de incremento automático. Si agrego un solo objeto, no hay problema. Si agrego dos objetos con la clave principal de cero, el marco de la entidad falla. Puedo especificar manualmente las claves principales, pero el objective de probar el EF fue hacer la vida más fácil, no más complicada. Aquí está el código y la excepción recibida a continuación.

foreach (Contact contact in contacts) { Instructor instructor = InstructorFromContact(contact); context.AddToInstructors(instructor); } try { context.SaveChanges(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } 

El error es:

System.InvalidOperationException : los cambios realizados en la base de datos se han confirmado correctamente, pero se ha producido un error al actualizar el contexto del objeto. ObjectContext podría estar en un estado incoherente. Mensaje de excepción interno: los cambios de aceptación no pueden continuar porque los valores de las claves del objeto entran en conflicto con otro objeto en ObjectStateManager. Asegúrese de que los valores de clave sean únicos antes de llamar a AcceptChanges. en System.Data.Objects.ObjectContext.SaveChanges (opciones de SaveOptions)
en System.Data.Objects.ObjectContext.SaveChanges () en DataMigration.Program.CopyInstructors () en C: \ Projects \ DataMigration \ Program.cs: línea 52

Establezca el atributo StoreGeneratedPattern en “Identidad” en su SSDL para el campo de autoincrement. Debería ayudar.

Esto sucede porque a pesar de que el valor generado automáticamente de la columna se creó en la base de datos, EF nunca lo supo.

Entonces, para informarle a EF que la BD manejará el valor generado debe abrir su archivo edmx (siempre uso el editor XML de VS para hacerlo) y en el área de lenguaje de definición de esquema de almacenamiento (SSDL), agregue el atributo StoreGeneratedPattern = “Identidad” a la columna que necesita el patrón generado. De esta forma, EF lee el valor generado en el DB y lo almacena en la memoria caché.

La definición del tipo de entidad se verá más o menos así:

        

Tenga en cuenta que si actualiza su modelo, todos estos cambios se perderán y tendrá que repetir todo el proceso.

Esto funciona para EF 1.0, no estoy seguro si en EF4 todos estos problemas ya están solucionados.

Estoy usando EF6, para configurar StoreGeneratedPattern, también puedes probar abrir el archivo EDMX en Visual Studio, hacer clic con el botón derecho en la Columna de Datos en la tabla y seleccionar Propiedades,

Luego puede configurarlo desde None a Identity en la Ventana de Propiedades: