Normalmente en una actualización es necesario obtener la entidad que se desea modificar, para poder reasignar los valores a los campos que se requieren modificar y despues ejecutar los cambios.
Un ejemplo sería:
    protected void btnActualizar_Click(object sender, EventArgs e)
    {
        Producto p = new Producto();
        try
        {
            using (DataClassesDataContext DB = new DataClassesDataContext())
            {
                p = DB.Productos.Single(pe => pe.IDProducto == 3);
                p.Codigo = "234";
                DB.SubmitChanges();
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }
Aunque el codigo de arriba actualice el registro de la entidad Producto, no es un buen uso de código, ya que la actualización esta ocurriendo dentro del evento click de un boton que pertenece a la interfaz de la aplicación.
El uso correcto sería que la actualización se lleve a cabo en un método dentro de una clase dedicada a este tipo de acciones.
Para llevar a cabo una actualización sin tener que pasar todos los parametros a modificar de la entidad Producto, hacemos uso de los métodos Attach() y Refresh() de LINQ.


El método Attach() como su nombre lo dice, adjunta una entidad que se encuentra fuera del contexto y lo liga al contexto actual, en este caso el DataContext.
El método Refresh() realiza la actualización dependiendo del modo que le sea especificado.
Ejemplo.
    protected void btnActualizar_Click(object sender, EventArgs e)
    {
        Producto p = new Producto();
        try
        {
            p.IDProducto = 3;
            p.Codigo = "234";
            if (Catalogo.ActualizaProducto(p))
                Response.Write("ActualizaciĆ³n exitosa");
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }
    public static bool ActualizaProducto(Producto ProductoModificado)
    {
        try
        {
            using (DataClassesDataContext DB = new DataClassesDataContext())
            {
                Producto ProductoNuevo = new Producto();
                ProductoNuevo.IDProducto = ProductoModificado.IDProducto;
                DB.Productos.Attach(ProductoModificado, ProductoNuevo);
                DB.Refresh(System.Data.Linq.RefreshMode.KeepChanges, ProductoModificado);
                DB.SubmitChanges();
                return true;
            }
        }
        catch (Exception ex)
        {            
            throw ex;
        }
    }
En vez de obtener la entidad que se desea modificar, se asignan los valores a modificar para despues llamar a un metodo que se encargue de actualizar la entidad. En el metodo ActualizaProducto, El ProductoNuevo es una nueva entidad que solo necesita el valor unico que identifica al registro, luego se asignan las dos entidades al Attach() que este se encargará de adjuntar la entidad a modificar al DataContext, después el Refresh() se encargara de actualizar los campos en la base, En este caso el modo "KeepChanges" mantendra los valores que se encuentran actualmente en la base de datos y actualizara solo los parametros especificados en la entidad, para finalmente realizar el SubmitChanges().
20/4/2010 01:49:39 pm

pon la mega consulta que te aventaste de linq

Reply
cybernoid
21/6/2010 08:06:08 pm

Hola,

Con estos sistemas ¿se actualizan las subentidades?

Es decir si tengo una entidad Cliente y esta a su vez tiene entidades PDV las entidades PDV se actualizan?

Reply
Eduardo
7/9/2010 01:20:14 am

Muy muy bueno!!!! MUCHAS GRACIAS POR EL EJEMPLO :)

Reply
Mark
3/6/2011 03:25:47 am

Hola que tal al tratar de hacer una actualizacion con el codigo siguiente
public void saveProductsChanges(IQueryable<tProducto> tabla)
{
using (ConsumoLinqDataContext DCActual = new ConsumoLinqDataContext())
{
try
{
foreach (tProducto item in tabla)
{
DCActual.tProductos.Attach(item);
DCActual.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, item);
DCActual.SubmitChanges();
}
}
catch
{
}
}
}

me da el error:
An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported.

alguna idea de como resolverlo?
les agradezco su ayuda!!!!

Reply
3/6/2011 03:42:46 pm

Hola Mark.
Respondiendo a tu pregunta del error: "An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported."

Es muy probable que tengas una conexion de un DataContext abierta anteriormente antes de ejecutar este metodo. Si es asi, cierrala antes de abrir otra, o mandate como parametro el DataContext abierto.
Si no es el caso de que tengas otro DataContext abierto, intenta la forma que muestro en este post de asignar el Identity Key a otro nuevo objeto del mismo tipo y atachar ambos objetos.

Espero esto ayude, ya que intente replicar tu ejemplo, pero no recibia ningun error. Saludos.

Reply

Your comment will be posted after it is approved.


Leave a Reply.