none
Actualizando Registro con Entity Framework

    Question

  • En algun momento me parecio ver un tema similar, pero la verdad no lo encontre, y esto del intity framework estoy comenzando a manejarlo.

    Mi problema es. En un formulario al actualizar los datos el proceso lo realiza bien, es decir los datos son actualizados, pero. Si consulto nuevamente el mismo registro me aparece como si no se hubieran realizado los cambios. Ahora para ver los cambios me veo forzado a cerrar el formulario y volverlo abrir. Nuevamente consulto el mismo registro y ahora si aparece con los cambios realizados... alguna idea ???


    Tuesday, April 10, 2012 10:16 PM

Answers

All replies

  • hola

    no sera que estas reconstruyendo al db nuevamente  de cero cada vez que ejecutas ?

    que base de datos usas? es sql server y esta el .mdf integrado al Solution Explorer, proque si es asi recuerda que el VS realiza una copia cada vez que ejecutas en el \bin\Debug del proyecto y es alli donde se realzian los cambios y actualizaciones

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Tuesday, April 10, 2012 10:27 PM
  • Bueno uso Sql Express R2, Visual Studio profesional 2010 con SP1,  este es el codigo que tengo en mi formulario 

    private void ActualizarCentroEducativo()
            {
                CentroEducativo CE = new CentroEducativo();
                CE.CodEscuela = Convert.ToInt32(txtCodigo.Text);
                CE.Nombre = txtNombre.Text;
                CE.Direccion = txtDireccion.Text;
                CE.Provincia = txtProvincia.Text;
                CE.Canton = txtCanton.Text;
                CE.Distrito = txtDistrito.Text;
                CE.Circuito = txtCircuito.Text;
                CE.Telefono = txtTelefono.Text;
                CE.Email = txtEmail.Text;
                CE.Web = txtWeb.Text;
                CE.Facebook = txtFacebook.Text;
                CE.Fax = txtFax.Text;
                CE.Aniversario = dtpAniversario.Value;
                BLCentroEducativo CentroE = new BLCentroEducativo();
                CentroE.ActualizaEscuela(CE);
            }

    y este es el codigo que tengo en mi capa de negocios

    public int ActualizaEscuela( CentroEducativo pEscuela)
            {
                var Escuela = ModeloEntidades.CentroEducativoes.FirstOrDefault(u => u.CodEscuela == pEscuela.CodEscuela);
                Escuela.Nombre = pEscuela.Nombre;
                Escuela.Direccion = pEscuela.Direccion;
                Escuela.Provincia = pEscuela.Provincia;
                Escuela.Canton = pEscuela.Canton;
                Escuela.Distrito = pEscuela.Distrito;
                Escuela.Circuito = pEscuela.Circuito;
                Escuela.Telefono = pEscuela.Telefono;
                Escuela.Email = pEscuela.Email;
                Escuela.Web = pEscuela.Web;
                Escuela.Facebook = pEscuela.Facebook;
                Escuela.Fax = pEscuela.Fax;
                Escuela.Aniversario = pEscuela.Aniversario;
                return ModeloEntidades.SaveChanges();
            }

    y esta mi cadena de conexion

    <add name="MatriculaEntities" connectionString="metadata=res://*/Model.Matricula.csdl

    |res://*/Model.Matricula.ssdl|res://*/Model.Matricula.msl;provider=

    System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;

    initial catalog=BDSTUD;integrated security=True;multipleactiveresultsets=True;

    App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

    y como te digo si actualiza los datos pero al consultar un registro recien actualizado no me lo muestra actualizado en el formulario, para ver los cambios tengo de cerrar el formulario volverlo abrir y consultar nuevamente el registro.

    Tuesday, April 10, 2012 10:58 PM
  • pero donde haces el SaveChanged() y en que otro lugar vuelves a recuperar o recargar lo que actualizaste ?


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Tuesday, April 10, 2012 11:25 PM
  • el metodo de consulta es el siguiente

    //variable de acceso al modelo
            MatriculaEntities MEscuela;

    esta variable la declaro como una variable globlal, por debajo de la llave public partial class

    en el load del formulario declaro la instancia    MEscuela = new MatriculaEntities();

    y este es el codigo de busqueda..

    private void BuscarEscuela(int pCodigo)
            {
                //Buscamos los datos correspondientes al pCodigo ingresado
                CentroEducativo ce = MEscuela.CentroEducativoes.FirstOrDefault(
                    a => a.CodEscuela == pCodigo);
                if (ce != null)
                {
                    this.txtCodigo.Text = ce.CodEscuela.ToString();
                    this.txtNombre.Text = ce.Nombre.ToString();
                    this.txtDireccion.Text = ce.Direccion.ToString();
                    this.txtProvincia.Text = ce.Provincia.ToString();
                    this.txtCanton.Text = ce.Canton.ToString();
                    this.txtDistrito.Text = ce.Distrito.ToString();
                    this.txtCircuito.Text = ce.Circuito.ToString();
                    this.txtTelefono.Text = ce.Telefono.ToString();
                    this.txtEmail.Text = ce.Email.ToString();
                    this.txtWeb.Text = ce.Web.ToString();
                    this.txtFacebook.Text = ce.Facebook.ToString();
                    this.txtFax.Text = ce.Fax.ToString();
                    this.dtpAniversario.Value = Convert.ToDateTime(ce.Aniversario);
                    this.Modificar = true;
                    this.Nuevo = false;
                    this.Botones();
                    this.txtCodigo.Focus();
                } 
                else
                {
                    //En caso de error se limpia el contenido del campo y se pasa el focus 
                    //al mismo objeto.
                    txtCodigo.Text = string.Empty;
                    txtCodigo.Focus();
                }
            }
    como ves la consulta no la hago desde la capa de negocios ya que no he encontrado algun ejemplo de como hacerlo...

    Tuesday, April 10, 2012 11:25 PM
  • Hola,

    • No me refrescan los datos.

    Vale, pues hasta donde te entendi refrescas solo en el Load(); acudiendo al metodo BuscarEscuela(int pCodigo){} Para que se refresque "automatico" deberias acudir a ese metodo como la accion final en el evento clic del boton Guardar.

    Ahora bien, que te funcione no quiere decir que lo estes haciendo bien. Usar un contexto como lo estas haciendo no es la mejor forma de hacerlo, es mucho mejor emplear un contexto por accion, de vida corta, de la forma:

    using(var context = new MatriculaEntities())
    {
        //....
    }

    • No puedo separar el acceso a datos de la presentación.

    Bien, en este caso podrias emplear alguna plantilla de generacion de codigo, para obtener unas Self-Tracking Entities que se encargaran tener una vigilancia PROPIA de los cambios, son un poco más pesadas y por eso no las recomiendo en entornos con alta concurrencia y transaccionalidad. Ademas de las STE puedes obtener entidades POCO y realizar esta separacion que deseas.

    Espero te sea de utilidad.

    Saludos.


    Nicolás Herrera
    Bogotá - Colombia
    BLOG - Leader Group BogotaDotNet
    "Daría todo lo que sé, por la mitad de lo que ignoro." Rene Descartes

    Wednesday, April 11, 2012 2:45 PM
  • La verdad, en este tema de entity framework existen muchos temas que se deben manejar con medio o bastante conocimiento, el poco conocimiento nos lleva a incurrir en ciertos errores. Lo mejor y mas sano es aprender un poco mas y luego de nuevo lanzarnos a la practica...

    Proximamente regresaré con mas conocimiento y espero que con menos problemas... si agradeceré que me recomienden algun buen libro que comprar para comenzar con mi proceso de aprendizaje...

    Gracias por las sugerencias. 

    Thursday, April 12, 2012 2:22 PM
  • Hola Eyder,

    Mira te paso un link del blog del autor de varios libros.

    http://geeks.ms/blogs/unai/ 

    Saludos,


    phurtado
    Mi Blog Blog
    Sigueme en Twitter

    • Marked as answer by Eyder Aguirre Monday, April 16, 2012 8:36 PM
    Thursday, April 12, 2012 2:29 PM
  • Excelente muchas gracias...
    Monday, April 16, 2012 8:36 PM
  • mira a mi tambien me paso lo mismo, es medio loco, jejejej mis formulario crean el objeto guardan la inforamacion, cuando quiero modificar el registro me la modifica y la puedo ver tranquilamente en mi aplicacion, ahorra el problema que tengo yo es que mi applicacion esta trabajando en red, pero que es lo que pasa? cuando se crea un nuevo registro yo en las dos o tres o cuatro pc que tenga instalada la aplicacion funcionando al mismo tiempo la puedo visualizar porque el objeto trae por primera ves la consulta, pero si el registro lo modifico solo puedo ver los cambio en donde ise la modificacion, ya que la otras aplicaciones ya trajeron el registro pero no lo refrescan, solo lo hace si cierro la aplicacion y la abro de vuelta, ahy si puedo ver el cambio.

    estuve buscando mucho este tema y aun no resuelvo por que pasa o como puedo hacer para que me traiga exactamente de la base de dato de sql serve el dato.

    por el momento como ya esta funcionando necesitaba genereal una solucion rapida, entonce me pregunte si ya que cada ves que creo un registro nuevo lo puedo visualizar en todas la aplicaciones que tenga abierta, entonce en donde valla a modificar solo tengo que hacer que modifique y al mismo tiempo que borre ese registro y lo cree de nuevo, de esta forma resolvi la refrescada, no es una solucion obtima, pero sirve igual. igualmente si llegas a resolverlo, decimelo porque tambien necesecito genereal refrescada con respecto a los bdcontext.

    mi correo es casescas@gmail.com

    Friday, April 27, 2012 10:13 PM