2012-03-08 52 views
9

Estoy utilizando Entity Framework 4.0 con C# .NET. Estoy tratando de crear una herramienta de migración "simple" para convertir los datos de una tabla a otra (las mesas no son los mismos)Entity Framework: Problema con IDENTITY_INSERT - "No se puede insertar un valor explícito para la columna de identidad en la tabla"

La base de datos es un servidor SQL Server 2005.

tengo una estructura objetivo DB similares a la siguiente:

MYID - int, primary key, identity specification (yes) 
MYData - varchar(50) 

En mi programa de migración, puedo importar la estructura de base de datos en el edmx. Luego apago manualmente StoreGeneratedPattern.

En mi programa de migración, apago la columna de identidad de la siguiente manera (He comprobado que en efecto apagarlo):

  using (newDB myDB = new newDB()) 
      { 
       //turn off the identity column 
       myDB.ExecuteStoreCommand("SET IDENTITY_INSERT SR_Info ON"); 
      } 

Después de que el código anterior, tengo el siguiente código:

  using (newDB myDB = new newDB()) 
      { 
       DB_Record myNewRecord = new DB_Record(); 
       //{do a bunch of processing} 
       myNewRecord.MYID = 50; 
       myDB.AddToNewTable(myNewRecord); 
       myDB.SaveChanges(); 
      } 

Cuando llega a myDB.SaveChanges(), genera una excepción: "No se puede insertar un valor explícito para la columna de identidad en la tabla".

Sé que el código funciona bien cuando goto manualmente la tabla de SQL Server y desactivo la especificación de identidad.

Mi preferencia es que la herramienta de migración maneje el activar y desactivar la especificación de identidad en lugar de tener que hacerlo manualmente en la base de datos. Esta herramienta de migración se utilizará en una base de datos de recinto de seguridad, una base de datos de desarrollo, una base de datos de control de calidad y, a continuación, una base de datos de producción completamente automatizada.

Alguna idea para hacer que esto funcione, ¿verdad?

que utiliza los pasos siguientes:

  1. Crear una tabla de base de datos con una columna de identidad.
  2. En Visual Studio, agregue un nuevo EDMX.
  3. En EDMX, selecciono Actualizar modelo de base de datos (y selecciono agregar la tabla deseada)
  4. En EDMX, hago clic en MYID y en el panel de propiedades, configuro StoreGeneratedProcedure en Ninguno.

En este punto, cuando agrego un nuevo registro con el conjunto MYID, el DB sobrescribe el valor de MYID con el valor Identity.

Hasta ahora, no importa dónde haya agregado "myDB.ExecuteStoreCommand (" SET IDENTITY_INSERT SR_Info ON ");", se comporta del mismo modo.

He intentado agregar un procedimiento almacenado y tampoco funciona.

Sospecho que, en última instancia, la migración no se automatizará por completo.

+0

EF no juega bien con columnas de identidad con fines de migración. Dejamos EF y usamos la biblioteca básica de SQL Server con Sql Command para hacer la migración. O puede usar metadatos para Crear y ejecutar SQL sin procesar. –

Respuesta

0

Esto parece prometedor Using IDENTITY_INSERT with EF4

Es, básicamente, tiene que asegurarse de que su modelo de datos sabe acerca de los cambios realizados en la base de datos, ya que ahora ya no están en sincronía con la tabla subyacente.

Sin embargo, no recomiendo usar EF como una herramienta de carga de datos de gran peso. Prefiere las herramientas SQL o ETL.

+0

Simon, solo estoy migrando un total de 30-40k de registros ... Esperaba hacer una rápida y sucia herramienta de migración en EF ya que estoy un poco oxidado en SQL "en bruto". LOL. Vi el artículo anterior antes de hacer esta pregunta. –

7

Cuando la columna es la identidad, la inserción de registro del marco de la entidad elevará el siguiente error:

Cannot insert explicit value for identity column in table 'MY_ENTITY' when IDENTITY_INSERT is set to OFF. To avoid error set entity property StoreGeneratedPattern="Identity"

<EntityType Name="MY_ENTITY"> 
    <Key> 
     <PropertyRef Name="UserID" /> 
    </Key> 
    <Property Name="RecordID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" /> 
</EntityType> 
+0

¿Dónde localizar este archivo? – Danilo

0
protected override void OnModelCreating(DbModelBuilder modelBuilder)  
{ 
    modelBuilder.Entity<EntityClass>().HasKey(p => p.Id); 

    modelBuilder.Entity<EntityClass>() 
     .Property(c => c.Id) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

    base.OnModelCreating(modelBuilder); 
} 
Cuestiones relacionadas