2015-09-01 22 views
11

Vorrei aggiungere i record in blocco a una tabella con gli ID specificati in modo da poter creare una gerarchia per la visualizzazione dei record in modalità vista struttura. Posso aggiungere singolarmente i record che funzionano bene e non ho impostato l'ID. Vorrei impostare gli ID solo in blocco, quindi ho impostato l'opzione DatabaseGenerated come None nella colonna id per la mia entità come None.Entity Framework 4.2, Impossibile impostare Identity Insert ON

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 

    foreach (ErrorCode ec in errorCodesStep3.errorcodesUsers) 
    { 

      errorCode.ID = ec.ID; 
      errorCode.ParentID = ec.ParentID; 
      errorCode.ErrorDescription = ec.ErrorDescription; 
      db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ErrorCode ON"); 
      db.ErrorCode.Add(errorCode); 
      db.SaveChanges();  
      scope.Complete(); 
    } 
} 

CodiceErrore

[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int ID { get; set; } 

sto ottenendo l'errore che:

Non è possibile impostare identità quando inserimento di identità è OFF.

Non so che cosa sia sbagliato, dal momento che ho visto esempi che l'inserimento di identità può essere acceso. Uso la versione 4.2.0.0 di EF e la versione di runtime v4.0.30319. Posso facilmente aggiungere un'istruzione INSERT tramite executeSQL con variabili parametrizzate, ma mi piacerebbe farlo con l'entity framework. Sembra che db.Database.ExecuteSqlCommand sia in un ambito separato e sia stato chiuso immediatamente e non sia disponibile quando viene eseguito db.savechanged.

+0

Questa domanda è stato chiesto e ha risposto prima di http://stackoverflow.com/questions/13086006/how-can-i-force-entity-framework-to-insert-identity-columns http://stackoverflow.com/questions/4998948/identity-insert-on-not-being-respected-for-entity-framework-dbset-add-method –

risposta

1

Prova questo: Entity Framework with Identity Insert

Forse è così:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    using (var db = new Context()) // your Context 
    { 
     db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ErrorCode ON"); 
     ErrorCode errorCode = db.ErrorCode.First(); // for example 
     foreach (ErrorCode ec in errorCodesStep3.errorcodesUsers) 
     { 
      errorCode.ID = ec.ID; 
      errorCode.ParentID = ec.ParentID; 
      errorCode.ErrorDescription = ec.ErrorDescription;  
      db.ErrorCode.Add(errorCode); 
     } 
     db.SaveChanges(); 
     db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ErrorCode OFF"); 
     scope.Complete(); 
    } 
} 
+0

L'ho provato, "dice che la connessione è stata chiusa" –

0

Ecco il codice che ho verificato fa quello che si vuole. L'idea è quella di utilizzare la connessione singola sia per ExecuteSqlCommand e inserire le operazioni, e sembra BeginTransaction() chiamata fa il trucco:

using (var db = new TestEntities()) { 
    using (var tran = db.Database.BeginTransaction()) { 
     db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Error ON"); 
      foreach (var id in Enumerable.Range(1, 20)) { 
       var ec = new Error(); 
       ec.ErrorID = id; 
       db.Errors.Add(ec); 
      } 
      db.SaveChanges(); 
      db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.Error OFF"); 
      tran.Commit(); 
     } 
    } 
} 
+0

risposta aggiornata con codice funzionante. – Evk

1

Ho affrontato lo stesso problema, abbiamo avuto un tavolo, che è l'identità è stata impostata. quindi avevamo bisogno di cambiare l'identità false, (intendo lo rendono come il seguente)

[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int ID { get; set; } 

ma, questo non funziona dopo aver fatto la migrazione e aggiornare il database. dopo aver cercato su Google il problema, ho fondato this article che indica che l'attivazione/disattivazione dell'identità non è un'operazione semplice e non è supportata ora da Entity Framework.

quindi la soluzione (che ha lavorato per me) è stato il seguente

in Visual Studio aprire la tabella nella finestra di progettazione Visualizza e selezionare la colonna che rappresenta la chiave primaria, (che nel suo caso "ID") quindi dal pannello delle proprietà trovare la proprietà "Identity Specification" (deve avere il valore di true) impostarla su false, e non dimenticare di aggiornare la tabella, facendo clic sul pulsante Aggiorna per eseguire l'istruzione SQL sulla tabella. (il pulsante di aggiornamento esiste nella barra degli strumenti della tabella)

quindi provare a eseguire il codice, dovrebbe funzionare.

Spero che questo sia utile. se avete qualche domanda, per favore fatemelo sapere.

0

Aggiungere un'altra colonna per gestire la gerarchia. La colonna Identity non deve essere utilizzata a questo scopo.

Ci scusiamo per non aver risposto alla domanda, ma non credo che la soluzione sia giusta.