2012-03-08 13 views
9

Sto utilizzando Entity Framework 4.0 con C# .NET. Sto cercando di creare uno strumento di migrazione "semplice" per convertire i dati da una tabella all'altra (le tabelle non sono la stessa cosa)Entity Framework: Problema con IDENTITY_INSERT - "Impossibile inserire il valore esplicito per la colonna Identity nella tabella"

Il database è uno SQL Server 2005.

ho una struttura di destinazione DB simile al seguente:

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

Nel mio programma di migrazione, importare la struttura DB in edmx. Quindi spengo manualmente StoreGeneratedPattern.

Nel mio programma di migrazione, spengo la colonna di identità come segue (ho verificato che effettivamente spegnerlo):

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

Dopo il codice di cui sopra, ho il seguente codice:

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

Quando arriva a myDB.SaveChanges(), genera un'eccezione: "Impossibile inserire il valore esplicito per la colonna Identity nella tabella".

So che il codice funziona correttamente quando passo manualmente la tabella di SQL Server e disattivo la specifica di identità.

La mia preferenza è che lo strumento di migrazione gestisca l'attivazione e la disattivazione delle specifiche di identità piuttosto che doverlo fare manualmente sul database. Questo strumento di migrazione verrà utilizzato su un database sandbox, un database di sviluppo, un database di controllo qualità e quindi un database di produzione così completamente automatizzato sarebbe bello.

Qualche idea per far funzionare correttamente?

ho usato le seguenti operazioni:

  1. Creare tabella del database con colonna di identità.
  2. In Visual Studio, aggiungere un nuovo EDMX.
  3. Su EDMX, selezionare Aggiorna modello dal database (e selezionare aggiungi la tabella desiderata)
  4. Su EDMX, faccio clic su MYID e nel riquadro delle proprietà, ho impostato StoreGeneratedProcedure su None.

A questo punto, quando aggiungo un nuovo record con MYID impostato, il DB sovrascrive il valore MYID con il valore Identity.

Finora, non importa dove ho aggiunto "myDB.ExecuteStoreCommand (" SET IDENTITY_INSERT SR_Info ON ");", si comporta allo stesso modo.

Ho provato ad aggiungere una procedura memorizzata e inoltre non funziona.

Sospetto che alla fine la migrazione non sarà completamente automatizzata.

+0

EF non gioca bene con le colonne Identity fini della migrazione. Abbiamo lasciato EF e utilizzato la libreria Sql Client di base con il comando Sql per eseguire la migrazione. Oppure puoi utilizzare i metadati per creare ed eseguire SQL raw. –

risposta

0

Questo sembra essere molto promettente Using IDENTITY_INSERT with EF4

Che, fondamentalmente, è necessario assicurarsi che il modello di dati conosce le modifiche apportate al database, come lo sono ora non sono più in sincronia con la tabella sottostante.

Tuttavia, non è consigliabile utilizzare EF come strumento per il caricamento di dati pesanti. Preferisci gli strumenti SQL o ETL.

+0

Simon, sto solo migrando per un totale di 30-40.000 di record ... Speravo di realizzare uno strumento di migrazione rapido e rapido in EF poiché sono un po 'arrugginito su SQL "raw". LOL. Ho visto l'articolo sopra prima di fare questa domanda. –

7

Quando colonna è l'identità, l'inserimento di record da Entity Framework si alza il seguente errore:

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

Dove si trova questo file? – 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); 
} 
Problemi correlati