9.27.2009

Entity Framework: Eliminando Entidades de una Lista y Refrescando el UI

En el post anterior vimos como implementar la interface IEquatable<T> para poder utilizar los métodos de la lista sobre las entidades tales como Contains e IndexOf. En este post vamos a ver como eliminar entidades de la lista y notificar este evento al UI que tenga binding con la lista afectada. Al mismo tiempo vamos a aplicar la modificación a la base de datos.

Eliminando una Entidad de la Lista y Notificando el UI

El primer paso para eliminar una entidad de la lista que tenemos ligada a nuestro UI es definir como vamos a llevar a cabo este procedimiento. En primera instancia vamos a agregar dos botones más a nuestra pantalla, uno para eliminar y otro para aplicar cambios. El diseño de la pantalla quedará como se observa a continuación

image

El siguiente paso es cambiar la forma en que hacemos binding de los datos desde el EF. Anteriormente utilizabamos una lista para almacenar nuestras entidades y así presentarlas en el UI, ahora vamos a cambiar esa lista por una colección del tipo ObservableCollection. Las colecciones de este tipo tienen la particularidad que notifica cuando se agrega o se elimina un elemento de la colección, o cuando se recarga la misma. Para esto, declaramos la colección del tipo de la entidad Empresa como lo hicimos en el post anterior.

ObservableCollection<Empresa> m_Empresas = new ObservableCollection<Empresa>();

public ObservableCollection<Empresa> Empresas
{
get { return m_Empresas; }
set { m_Empresas = value; }
}


El siguiente paso es hacer el binding desde el EF y ligarlo con el control a través del cual queremos desplegar los datos. En nuestro caso tenemos una función que nos devuelve la colección de empresas – ObtenerEmpresa – y en el load de la forma, procedemos a ligar la colección al Grid de Empresas.



private void Window_Loaded(object sender, RoutedEventArgs e)
{
Empresas = ObtenerEmpresas();
dgEmpresas.ItemsSource = Empresas;
}
public ObservableCollection<Empresa> ObtenerEmpresas()
{
UseCasesEntities entities = GetEntity();
var Empresas = from e in entities.Empresa select e;
return new ObservableCollection<Empresa>(Empresas.ToList());
}



El método GetEntity() es un método que utiliza un patrón singleton para obtener siempre el mismo contexto del Entity Framework y así poder eliminar, modificar, o agregar entidades al repositorio de datos.



static UseCasesEntities entities;

private static UseCasesEntities GetEntity()
{
if (entities == null)
entities = new UseCasesEntities();
return entities;
}



El siguiente paso es agregar el código necesario para poder eliminar la entidad de la colección cuando el usuario así lo requiere, es decir cuando seleccione una entidad y de clic en el botón de eliminar. En este caso obtenemos la entidad seleccionada casteando la fila seleccionada a un objeto tipo Empresa, seguidamente y gracias a la implementación de IEquatable<T> podemos utilizar el método remove de la colección para remover la entidad de la colección. También procedemos a marcar el objeto seleccionado como eliminado dentro del contexto del entity framework.



private void btnEliminar_Click(object sender, RoutedEventArgs e)
{
Empresa tmpEmpresa = dgEmpresas.SelectedItem as Empresa;
Empresas.Remove(tmpEmpresa);
GetEntity().DeleteObject(tmpEmpresa);
}



Con estos cambios, ya tenemos la funcionalidad a nivel de UI, si ejecutamos el código anterior, vamos a eliminar los ítems de la lista, y sin refrescar la lista, obtenemos el cambio en el UI.



Aplicando los cambios en el UI



Una vez realizados los cambios en el UI, debemos persistir los cambios en la base de datos. Para llevar a cabo esta funcionalidad, simplemente agregamos el siguiente código al manejador del evento clic del botón aplicar.



private void btnAplicar_Click(object sender, RoutedEventArgs e)
{
GetEntity().SaveChanges();
}





En este caso, solamente ejecutamos el método SaveChanges para persistir el cambio o los cambios a la base de datos.



No hay comentarios: