5

Al principio debo mencionar que este problema solo ocurre en las aplicaciones de Windows Forms y el mismo programa en modo web, por ejemplo, con MVC3 funciona perfecto.Entity framework no guarda las entradas de datos en la base de datos

Hace algunos días escribí un programa de formulario de Windows muy simple utilizando Visual Studio 2010 ultimate con una base de datos SQL Express. Agregué la base de datos seleccionando Agregar> Nuevo elemento> Base de datos basada en servicios y un modelo de datos de entidad basado en esta base de datos de la misma manera. Usé Entity Framework para agregar algunos registros nuevos a las tablas. Ya había hecho algo así con VS 2008 SP1 sin problemas, así que hice lo mismo. El programa se compiló y ejecutó sin errores e ingresé algunos datos nuevos. Después de salir del programa volví a la base de datos y no sucedió nada. No se guardó ninguna información que ingresé. Depuro el programa paso a paso y todo estuvo bien. El siguiente código está relacionado con un programa muy simple con el problema mencionado. La base de datos tiene una tabla (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(); 
     } 
    } 
} 

Estaré muy agradecido si alguien me ayuda. Gracias por adelantado.

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

Después de la edición:

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

tratar de sustituir "nuevos db.Books();" con "db.Books.CreateObject();" –

+0

Asegúrese de estar revisando la base de datos correcta. –

+0

@Davide: utilicé CreateObject como dijo, pero el problema persiste. – Monoloox

Respuesta

4

Finalmente después de mucho buscar y preguntar he encontrado la solución en MSDN gracias a Patrice Scribe Se puede ver here

+0

Gracias Monoloox.Después de una larga búsqueda, finalmente recibí su respuesta. –

1

intente esto:

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

Editar:

Tengo este código en una biblioteca de clase (mi DAL) en producción y funciona bien:

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; 
    } 

cuenta de que en realidad no asignar el PK (ID de datos), ya que será asignado por la base de datos, me devolverlo a la persona que llama por lo que ha invocado el método save llega a conocer generó el automóvil ID, en caso de que lo necesite.

+0

Estimado Davide ... Hice lo que dijiste pero el resultado sigue siendo el mismo. Creo que el problema es sobre el método SaveChanges() porque después de ejecutar el (db.Books.AddObject) o (db.Books.Attach) el objeto se ha agregado al ObjectStateManager y parece que SaveChanges no puede guardarlo en la base de datos. Sin embargo, no informa ningún error durante el proceso de entrada – Monoloox

+0

Una cosa más. Como dije cuando escribo el mismo código en forma web o MVC, funciona sin este problema. Sucede solo en las aplicaciones de Windows y no sé por qué. – Monoloox

+0

Davide ¿por qué db.Attach ayuda? Desde los documentos de MS: "db.Attach se utiliza para volver a llenar un contexto con una entidad que ya existe en la base de datos. SaveChanges no intentará insertar una entidad adjunta en la base de datos porque se supone que ya está allí" – Izzy

Cuestiones relacionadas