Mantenimiento a BD Usando Entity Framework y Linq

lunes, 25 de junio de 2012

Siempre que desarrollamos aplicaciones que usan bases de datos nos vemos en la necesidad de agregar, editar, eliminar o buscar registros pues bien ahora veremos como hacer todas estas operaciones usando entity framework y linq.

Para este ejemplo desarrolle una aplicación en 2 capas y utilizo una base de datos llamada Database que tiene una tabla llamada Personas.

El ejemplo esta desarrollado con visual estudio 2010 en c# y vb.net

Base Datos

Lo primero que aremos es crear el modelo conceptual de nuestra base de datos para eso agregamos un nuevo elemento y elegimos entity data model y seguimos los pasos necesarios para que el visual estudio nos cree nuestra clase y propiedades de nuestra tabla personas.

Entity Data

Modelo

Ahora que ya tenemos nuestro modelo entity de nuestra tabla creado empezaremos a programar todas las operaciones agregamos una clase llamada Datos.cs o Datos.vb.

Para cada operación crearemos un método comenzaremos con el método que recupera todos los registros de nuestra tabla.

public static List<Personas> CargarDatos()
{
using (DatabaseEntities bd = new DatabaseEntities())
{
var datos = (from p in bd.Personas select p).ToList();

return datos;
}
}

Public Shared Function CargarDatos() As List(Of Personas)
Using bd As New DatabaseEntities()
Dim datos = (From p In bd.Personas Select p).ToList()

Return datos
End Using
End Function

Lo que hacemos es crear un método que retornara una lista de tipo personas y dentro del método creamos una instancia de nuestro modelo y con linq hacemos la consulta para que nos muestre todos los registros que hay en la tabla personas es como hacerle un select a toda la tabla.

Ahora creamos el método que nos servirá para buscar registros por medio del nombre.

public static List<Personas> Buscar(string nombre)
{
using (DatabaseEntities bd = new DatabaseEntities())
{
var buscar = (from p in bd.Personas
where p.Nombre.StartsWith(nombre)
select p).ToList();

return buscar;
}
}

Public Shared Function Buscar(ByVal nombre As String) As List(Of Personas)
Using bd As New DatabaseEntities()
Dim busca = (From p In bd.Personas
Where p.Nombre.StartsWith(nombre)
Select p).ToList()

Return busca
End Using
End Function

Como podemos ver es parecido al anterior lo único que cambia es la consulta linq como lo que queremos hacer es buscar registros por nombre aremos uso de where para filtrar los registros por medio del nombre también hacemos uso de StartsWith que es algo similar al like de sql para que por ejemplo si escribimos la letra c se nos mostraran todos los registros que empiecen con la letra c.

Ahora creemos el método que nos servirá para agregar registros.
public static void Agregar(string nombre, string apellido, int edad,string profesion)
{
using (DatabaseEntities bd = new DatabaseEntities())
{
bd.Personas.AddObject(new Personas { Nombre = nombre, Apellido = apellido, Edad = edad, Profesion = profesion });
bd.SaveChanges();
}
}

Public Shared Sub Agregar(ByVal nombre As String, ByVal apellido As String, ByVal edad As Integer, ByVal profesion As String)
Using bd As New DatabaseEntities()
bd.Personas.AddObject(New Personas() With {.Nombre = nombre, .Apellido = apellido, .Edad = edad, .Profesion = profesion})
bd.SaveChanges()
End Using
End Sub

Lo que hacemos aquí es crear un método que recibirá los parámetros necesarios para agregar un registro, luego como en todos los métodos creamos una instancia de nuestro modelo y hacemos uso del método AddObject para agregar un un nuevo objeto(registro) de tipo persona y guardamos los datos en nuestra bd con el método SaveChanges.

Ahora creamos el método para editar los registros.
public static void Editar(int id,string nombre, string apellido, int edad, string profesion)
{
using (DatabaseEntities bd = new DatabaseEntities())
{
var editar = (from p in bd.Personas
where p.Id == id
select p).Single();

editar.Nombre = nombre;
editar.Apellido = apellido;
editar.Edad = edad;
editar.Profesion = profesion;
bd.SaveChanges();
}
}

Public Shared Sub Editar(ByVal id As Integer, ByVal nombre As String, ByVal apellido As String, ByVal edad As Integer, ByVal profesion As String)
Using bd As New DatabaseEntities()
Dim editar = (From p In bd.Personas
Where p.Id = id
Select p).Single()

editar.Nombre = nombre
editar.Apellido = apellido
editar.Edad = edad
editar.Profesion = profesion
bd.SaveChanges()
End Using
End Sub

Al igual que el anterior creamos un método que recibirá los parámetros necesarios para editar un registro y luego haciendo uso de linq hacemos una consulta para recuperar el registro a editar y le asignamos los nuevos valores.

Ahora veremos el método que nos servirá para eliminar un registro.
public static void Eliminar(int id)
{
using (DatabaseEntities bd = new DatabaseEntities())
{
var eliminar = (from p in bd.Personas
where p.Id==id
select p).Single();

bd.DeleteObject(eliminar);
bd.SaveChanges();
}
}

Public Shared Sub Eliminar(ByVal id As Integer)
Using bd As New DatabaseEntities()
Dim eliminar = (From p In bd.Personas
Where p.Id = id
Select p).Single()

bd.DeleteObject(eliminar)
bd.SaveChanges()
End Using
End Sub

Creamos un método que recibirá un parámetro que sera el id por el cual eliminaremos el registro y haciendo uso de linq recuperamos el registro por medio del id y luego eliminamos el registro con el método DeleteObject.

Por ultimo crearemos un método que nos servirá para cargar en nuestro formulario de edición los datos del registro que queremos editar.
public static Personas ObtenerId(int id)
{
Personas persona = new Personas();
using (DatabaseEntities bd = new DatabaseEntities())
{
var regis = (from p in bd.Personas
where p.Id==id
select p).Single();

persona.Id = regis.Id;
persona.Nombre = regis.Nombre;
persona.Apellido = regis.Apellido;
persona.Edad = regis.Edad;

return persona;
}
}

Public Shared Function ObtenerId(ByVal id As Integer) As Personas
Dim persona As New Personas()
Using bd As New DatabaseEntities()
Dim regis = (From p In bd.Personas
Where p.Id = id
Select p).Single()

persona.Id = regis.Id
persona.Nombre = regis.Nombre
persona.Apellido = regis.Apellido
persona.Edad = regis.Edad

Return persona
End Using
End Function

Lo que hacemos es crear un método de tipo personas que recibirá el id como parámetro y luego haciendo uso de linq recuperamos el registro y le asignamos a cada propiedad de nuestra clase persona los datos obtenidos en la consulta y por ultimo retornamos los datos.

Eso seria todo en nuestra clase datos.

Ahora pasemos a diseñar nuestros formularios para este caso serán 3 el principal que sera donde se mostraran los datos en un datagrid ademas se podrá hacer la búsqueda de registros y tendrá 3 botones que serán para agregar editar y eliminar un registro.

Principal

También creamos los formulario que nos servirán para agregar y editar los registros.

Agregar

Editar

Ahora empezaremos a programar en nuestros formularios empecemos con el form1 o formulario principal, comenzaremos con el código que nos servirá para cargar los datos y hacer la búsqueda.
public void cargar()
{
dataGridView1.DataSource = Datos.CargarDatos();
}

private void Form1_Load(object sender, EventArgs e)
{
cargar();
}

private void btnbuscar_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = Datos.Buscar(txtnombre.Text);
}

Public Sub cargar()
dataGridView1.DataSource = Datos.CargarDatos()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
cargar()
End Sub

Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click
dataGridView1.DataSource = Datos.Buscar(txtnombre.Text)
End Sub

El código es sencillo y fácil de entender así que no entrare en mayor explicación primero creamos un método donde se cargan los datos y luego en el evento load cargamos los datos y luego en el evento del botón buscar llamamos el método buscar y le enviamos el parámetro para obtener los datos.

Ahora veamos como agregar un nuevo registro.
//cargar datos al cerrar form agregarregistro y actualizar
private void obj_FormClosed(object sender, FormClosedEventArgs e)
{
cargar();
}

private void btnagregar_Click(object sender, EventArgs e)
{
Form2 obj = new Form2();
//abrir el otro formulario y actualizar datagrid al cerrarlo
obj.FormClosed += new System.Windows.Forms.FormClosedEventHandler(obj_FormClosed);
obj.Show();
}

'cargar datos al cerrar form agregarregistro y actualizar
Private Sub obj_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
cargar()
End Sub

Private Sub btnagregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnagregar.Click
Dim obj As New Form2()
'abrir el otro formulario y actualizar datagrid al cerrarlo
AddHandler obj.FormClosed, New System.Windows.Forms.FormClosedEventHandler(AddressOf obj_FormClosed)
obj.Show()
End Sub

Vemos que primero creamos un método que nos servirá para detectar el cierre tanto del formulario para agregar registro como el de editar esto lo hacemos para actualizar los datos siempre que hagamos cambios desde los 2 formularios, luego en el evento del botón llamamos al form2 que es donde agregamos un nuevo registro.

Ahora veamos como editamos y eliminamos un registro.
private void btneditar_Click(object sender, EventArgs e)
{
DataGridViewRow row = dataGridView1.CurrentRow;
int id = Convert.ToInt32(row.Cells[0].Value);

Form3 obj = new Form3(id);
obj.FormClosed += new System.Windows.Forms.FormClosedEventHandler(obj_FormClosed);
obj.Show();

}

private void btneliminar_Click(object sender, EventArgs e)
{
DialogResult resul = MessageBox.Show("Seguro que quiere eliminar el Registro?", "Eliminar Registro", MessageBoxButtons.YesNo);
if (resul == DialogResult.Yes)
{
DataGridViewRow row = dataGridView1.CurrentRow;
int idpersona = Convert.ToInt32(row.Cells[0].Value);
Datos.Eliminar(idpersona);
MessageBox.Show("Se Elimino el Registro Con Numero ID: " + idpersona, "Eliminar Registro");
cargar();
}
}

Private Sub btneditar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btneditar.Click
Dim row As DataGridViewRow = dataGridView1.CurrentRow
Dim id As Integer = Convert.ToInt32(row.Cells(0).Value)

Dim obj As New Form3(id)
AddHandler obj.FormClosed, New System.Windows.Forms.FormClosedEventHandler(AddressOf obj_FormClosed)
obj.Show()
End Sub

Private Sub btneliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btneliminar.Click
Dim resul As DialogResult = MessageBox.Show("Seguro que quiere eliminar el Registro?", "Eliminar Registro", MessageBoxButtons.YesNo)
If resul = DialogResult.Yes Then
Dim row As DataGridViewRow = dataGridView1.CurrentRow
Dim idpersona As Integer = Convert.ToInt32(row.Cells(0).Value)
Datos.Eliminar(idpersona)
MessageBox.Show("Se Elimino el Registro Con Numero ID: " & idpersona, "Eliminar Registro")
cargar()
End If
End Sub

En el evento click de botón editar igual que el anterior abrimos el form3 que es el que nos servirá para editar los registros y actualizamos los datos al cerrarlo, algo importante es que al form3 le enviamos el id del registro a editar.

Y en el evento del botón eliminar lo único que hacemos es eliminar el registro seleccionado en el datagrid pasandole como parametro el id del registro seleccionado a nuestro metodo eliminar.

Ahora pasamos al código del form2 que es en el que agregamos los registros.

private void btnaceptar_Click(object sender, EventArgs e)
{
DataAcces.Datos.Agregar(txtnombre.Text,txtapellido.Text,Convert.ToInt32(txtedad.Text),cbbprofesion.SelectedItem.ToString());
MessageBox.Show("Registro Agregado...","Agregar Registro");
this.Close();
}

Private Sub btnaceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnaceptar.Click
DataAcces.Datos.Agregar(txtnombre.Text, txtapellido.Text, Convert.ToInt32(txtedad.Text), cbbprofesion.SelectedItem.ToString())
MessageBox.Show("Registro Agregado...", "Agregar Registro")
Me.Close()
End Sub

Aquí lo único que hacemos es llamar al metodo agregar y le enviamos los datos necesarios para agregar un registro.

Y por ultimo en nuestro form3 tendremos el siguiente codigo.
private int id;
public Form3(int idempleado)
{
InitializeComponent();
id = idempleado;
}

private void Form3_Load(object sender, EventArgs e)
{
// se carga el registro que se quiere editar
cbbprofesion.SelectedIndex = 0;
Personas persona = Datos.ObtenerId(id);
id = persona.Id;
txtnombre.Text = persona.Nombre;
txtapellido.Text = persona.Apellido;
txtedad.Text = persona.Edad.ToString();
}

private void btnaceptar_Click(object sender, EventArgs e)
{
Datos.Editar(id,txtnombre.Text,txtapellido.Text,Convert.ToInt32(txtedad.Text),cbbprofesion.SelectedItem.ToString());
MessageBox.Show("Registro Actualizado...", "Actualizar Registro");
this.Close();
}

Private id As Integer
Public Sub New(ByVal idempleado As Integer)
InitializeComponent()
id = idempleado
End Sub

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' se carga el registro que se quiere editar
cbbprofesion.SelectedIndex = 0
Dim persona As Personas = Datos.ObtenerId(id)
id = persona.Id
txtnombre.Text = persona.Nombre
txtapellido.Text = persona.Apellido
txtedad.Text = persona.Edad.ToString()
End Sub

Private Sub btnaceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnaceptar.Click
Datos.Editar(id, txtnombre.Text, txtapellido.Text, Convert.ToInt32(txtedad.Text), cbbprofesion.SelectedItem.ToString())
MessageBox.Show("Registro Actualizado...", "Actualizar Registro")
Me.Close()
End Sub

Aqui lo que hacemos es primeramente obtener los datos del registro a editar en el evento load eso lo hacemos con el metodo ObtenerId y le enviamos como parametro el dato recibido del formulario principal.

Y en el evento del boton llamamos a nuestro metodo Editar y le enviamos los parametros para editar el registro.

Bueno eso es todo por ahora, como podemos notar usar entity framework y linq nos facilita el trabajo para trabajar con bases de datos.

Corriendo

Descargar Proyecto C#

Descargar Proyecto VB.Net

17 comentarios:

Anónimo dijo...

tengo problemas en descargar el proyecto en vb

Cristian Torres dijo...

Cual es el error?

omarmv22 dijo...

deberías hacer script en lugar de poner la db

RODDY_EMELEXISTA dijo...

hey amigo ayudame con algo me sale un error en el datagriv...


Error 1 El tipo 'datos.cliente' está definido en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'datos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. C:\Users\HP G4\Documents\Visual Studio 2010\Projects\exsegundopar\presentacion1\Fromulariocliente\principal.cs 22 13 presentacion1

RODDY_EMELEXISTA dijo...

ALGUIEN ME PODRIA AYUDAR ME SALE UN ERROR AL MOMENTO DE RETORNAR EL CVALOR DE LA LISTA

Cristian Torres dijo...

Es un error muy raro estas trabajando en capas usando proyectos class library porque podria ser que en una capa no estés agregando referencia de otra capa.

Saludos.

Ataraxio dijo...

Gracias, muy bueno tu blog, saludos desde Ecuador en Sudamérica :)
Bendiciones chao!!!

Cristian Torres dijo...

Hola.
Me alegro te sirva mi blog de algo.
Saludos amigo.

RODDY_EMELEXISTA dijo...

haaaaa, luego reviso y te cuento como me va, jejejje, mijo ta vacano su blog te felicito es el mas comleto y detallado que es visto voy a tratar de hacer todo lo ke tiene aka... pilas estoy estudiando el menbreship en asp.net si tenes algun ejemplo sensillo para agregar roles de usuario utilizando esta herramienta te lo agradeceria mucho... pilas men la plena ke esta vacano tu blog.... saludos

luis dijo...

muy buen blog, como podria editar de esta manera pero dos entidades a la ves como se podria hacer

Cristian Torres dijo...

Hola Luis.
Para hacer lo que mencionas lo único que tienes que hacer es agregar antes del método SaveChanges() los datos de la otra entidad ya que este método es el que guarda los datos en la bd.

bd.Personas.AddObject(new Personas { Nombre = nombre, Apellido = apellido });
bd.Usuarios.AddObject(new Usuarios { usuario = usuario, password = password });
bd.SaveChanges();

Como ves ahí estaría insertando 2 registros uno de personas y otro de usuarios.

Saludos.

luis dijo...

gracias me sirvio muchisimo, exelentes ejemplos

Cristian Torres dijo...

Hola Luis.
Me alegro que los ejemplos te sirvan.

Saludos.

Anónimo dijo...

hola soy clara
que bien cristian por este blog,gracias

Cristian Torres dijo...

Hola Clara me alegro que mi blog te guste y espero te sea de ayuda.

Saludos.

Anónimo dijo...

hola cristian soy clara me gustaria una ayudita en como programar el boton de actualizar

gracias

Cristian Torres dijo...

Hola Clara.
Cual seria el problema que tienes?

Saludos.

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.