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:
- Creare tabella del database con colonna di identità.
- In Visual Studio, aggiungere un nuovo EDMX.
- Su EDMX, selezionare Aggiorna modello dal database (e selezionare aggiungi la tabella desiderata)
- 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.
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. –