Devo essere in grado di impostare la chiave primaria delle entità che sto cercando di aggiungere nella mia lista "final_zones". Ho un costruttore di controller come segue:
public UtilController(CFETSContext context)
{
_context = context;
}
......Then in a web api method.........
using (var transaction = _context.Database.BeginTransaction())
{
_context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [CFETSWeb].[dbo].[Zone] ON");
_context.SaveChanges();
transaction.Commit();
}
using (var transaction = _context.Database.BeginTransaction())
{
_context.Zones.AddRange(final_zones);
_context.SaveChanges(); //ERROR HERE
transaction.Commit();
}
Non importa quello che faccio, non riesco a ottenere IDENTITY_INSERT per accendere. Ottengo il seguente errore:
{"Cannot insert explicit value for identity column in table 'Zone' when IDENTITY_INSERT is set to OFF."}
Non riesco proprio a spegnerlo. Posso aggiungere entità al mio DB nel controller, quindi so che tutto il resto funziona. Ho provato a farlo anche senza una transazione con lo stesso risultato.
_context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [CFETSWeb].[dbo].[Zone] ON");
_context.Zones.AddRange(final_zones);
_context.SaveChanges();
Qualche idea? Sono in perdita per cosa provare dopo. Grazie.
L'ho risolto con il seguente:
using (var dbContextTransaction = _context.Database.BeginTransaction())
{
try
{
_context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [CFETSWeb].[dbo].[Zone] ON");
_context.Zones.AddRange(final_zones);
_context.SaveChanges();
dbContextTransaction.Commit();
}
catch (Exception e)
{
dbContextTransaction.Rollback();
}
}
NOTA: devi farlo per tabella. IDENTITY_INSERT può essere impostato solo per 1 tabella alla volta, quindi puoi farlo in questo modo o impostarlo su OFF nella stessa transazione.
Inoltre, IDENTITY_INSERT deve essere in una transazione, poiché rimane attivo per la durata di una transazione.