5

Inizialmente dovrei ricordare che questo problema si verifica solo nelle applicazioni Windows Form e lo stesso programma in modalità Web, ad esempio, con MVC3 funziona perfettamente.Il framework Entity non salva le voci di dati nel database

Alcuni giorni fa ho scritto un semplice programma di Windows form utilizzando Visual Studio 2010 ultimate con un database SQL Express. Ho aggiunto il database scegliendo Aggiungi> Nuovo elemento> Database basato sul servizio e un modello di dati dell'entità basato su questo database nello stesso modo. Ho usato il framework Entity per aggiungere nuovi record alle tabelle. Avevo fatto una cosa del genere con VS 2008 SP1 senza alcun problema quindi ho fatto lo stesso. Il programma è stato compilato e eseguito senza errori e ho inserito alcuni nuovi dati. dopo essere uscito dal programma sono tornato al database e non è successo nulla. Nessuna delle informazioni che avevo inserito era stata salvata. Eseguo il debug del programma passo dopo passo e tutto andava bene. Il seguente codice è correlato a un programma molto semplice con il problema menzionato. Database ha una tabella (libro):

namespace Book 
{ 
    public partial class BookForm : Form 
    { 
     BookDatabaseEntities db = new BookDatabaseEntities(); 

     public BookForm() 
     { 
      InitializeComponent(); 
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      Book bookToCreate = new Book(); 

      bookToCreate.Id = Guid.NewGuid(); 
      bookToCreate.Title = titleTextBox.Text; 

      db.Books.AddObject(bookToCreate); 
      db.SaveChanges(); 
     } 
    } 
} 

Sarò molto grato se qualcuno mi aiuta. Grazie in anticipo.

.................

Dopo la modifica:

namespace Book 
{ 
    public partial class BookForm : Form 
    { 
     //BookDatabaseEntities db = new BookDatabaseEntities(); 

     public BookForm() 
     { 
      InitializeComponent(); 
     } 

     private void saveButton_Click(object sender, EventArgs e) 
     { 
      var db = new BookDatabaseEntities(); 
      var bookToCreate = db.Books.CreateObject(); 

      //Book bookToCreate = new Book(); 

      bookToCreate.Id = Guid.NewGuid(); 
      bookToCreate.Title = titleTextBox.Text; 

      db.AcceptAllChanges(); 
      db.Books.AddObject(bookToCreate); 
      db.SaveChanges(); 
     } 
    } 
} 
+0

provare a sostituire "nuovo db.Books();" con "db.Books.CreateObject();" –

+0

Assicurarsi di controllare il database corretto. –

+0

@Davide: ho usato CreateObject come hai detto ma il problema esiste ancora. – Monoloox

risposta

4

Finalmente dopo un sacco di ricerca e chiedendo ho trovato la soluzione in MSDN grazie alla Patrice Scribe si può vedere here

+0

Grazie Monoloox. Dopo una lunga ricerca finalmente ho avuto risposta da voi. –

1

provare questo:

db.Attach(bookToCreate); 
db.SaveChanges(); 

Edit:

Ho questo codice in una libreria di classi (il mio DAL) in produzione e funziona bene:

using (var dbContext = new DbEntities()) 
    { 
     var job = dbContext.RiskToolJob.CreateObject(); 

     job.AnalysisDataID = analysisDataID; 

     job.JobRmsAnalysisID = RMSAnalysisID; 
     job.UserName = userName; 

     job.JobCreated = DateTime.UtcNow; 

     dbContext.RiskToolJob.AddObject(job); 

     dbContext.SaveChanges(); 

     return job.DataId; 
    } 

avviso che in realtà io non assegnare il PK (dataID) perché sarà assegnato dal database, torno al chiamante in modo che ha invocato il metodo di salvataggio viene a sapere generato l'auto ID, nel caso ne abbia bisogno.

+0

Caro Davide ... Ho fatto quello che hai detto ma il risultato è sempre lo stesso. Penso che il problema riguardi il metodo SaveChanges() perché dopo aver eseguito (db.Books.AddObject) o (db.Books.Attach) l'oggetto è stato aggiunto all'oggetto ObjectStateManager e sembra che SaveChanges non sia in grado di salvarlo nel database. Tuttavia non segnala alcun errore durante il processo di immissione – Monoloox

+0

Un'altra cosa .. Come ho detto quando scrivo lo stesso codice in formato web o MVC funziona senza questo problema. Succede solo nelle app di Windows Form e non so perché. – Monoloox

+0

Davide perché db.Attach aiuto? Da MS doc - "db.Attach viene utilizzato per ripopolare un contesto con un'entità che è già esistente nel database, pertanto SaveChanges non tenterà di inserire un'entità collegata nel database perché si presume che sia già presente" – Izzy

Problemi correlati