2010-04-07 10 views
5

Supongamos que tengo una tabla Orders en mi base de datos y una clase de modelo correspondiente generada por el diseñador de VS2008 "Linq to SQL Classes". Supongamos que también tengo un procedimiento almacenado (ProcessOrder) en mi base de datos que utilizo para hacer algún procesamiento en un registro de orden.¿Cómo obtengo Linq-to-SQL para actualizar su copia local de un registro de base de datos?

Si hago lo siguiente:

var order = dataContext.Orders.Where(o => o.id == orderId).First(); 

// More code here 

dataContext.ProcessOrder(orderId); 

order.Status = "PROCESSED"; 

dataContext.SubmitChanges(); 

... entonces voy a conseguir una violación de concurrencia si el procedimiento almacenado ProcessOrder ha modificado el orden (que por supuesto es muy probable), porque L2S detectará que el registro de la orden ha cambiado y no enviará los cambios a esa orden.

Eso es todo bastante lógico, pero ¿qué ocurre si quiere para actualizar el registro de la orden después de llamar al proceso almacenado? ¿Cómo le digo a L2S que se olvide de su copia en caché y la actualice desde el DB?

Respuesta

15

Puede hacerlo con el método Refresh en el contexto de datos, así:

DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, 
        DataContext.Orders); 
+0

perfecto. Veo que también puedo especificar un registro de pedido específico, que es exactamente lo que necesito. ¡Gracias! –

+1

Pero no actualiza la propiedad de recopilación de navegación asociada que se asigna a otra tabla. Está actualizando solo las propiedades que se asignan a la columna de la tabla a la que apunta la entidad actual. ¿Hay alguna forma de salir de esto? – RBT

Cuestiones relacionadas