Sie sind auf Seite 1von 11

2/7/2019 Tips para llevarse bien con Entity Framework I

Ya salió nuestra plataforma e-learning KODOTI.  Click para unirte


Estudia con KODOTI.  Únete

TIPS PARA LLEVARSE BIEN CON ENTITY


FRAMEWORK I
VEREMOS VARIOS CONSEJOS PARA LLEVARNOS BIEN CON ESTA
HERRAMIENTA Y PODER SACARLE EL JUGO.
 RODRÍGUEZ PATIÑO, EDUARDO
 2014-11-06  34,402 LECTURAS

Hemos migrado hace poco nuestras publicaciones del blog antiguo. Si crees que
esta se encuentra incompleta o sin coherencia deja un comentario para
restaurarla manualmente.

Esta entrada requiere conocimientos previos con el Entity Framework

Comparto esta entrada donde dare ciertas pautas para aprender a sobrevivir y llevase
con nuestro amigo el Entity Framework.

https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 1/11
2/7/2019 Tips para llevarse bien con Entity Framework I

1- Cuando trabajamos un proyecto avanzado y conectamos a N base de datos la tarea se


pone un poco más compleja.. Por lo tanto, mi solución en estos casos fue trabajar a
punta de vistas (SQL Views) y cuando tengo que hacer un insert/update/delete declaro
varias cadenas de conexión y veo con que contexto trabajar.

2- Si vas a iniciar un proyecto de cero te recomiendo previamente analizar y CONOCER


las reglas de negocio para tu sistema. Asimimo, define las reglas de negocios y crea
tus tablas con las siguientes pautas:

Nuestro primary key deben llamarse "id", ser numérico y asignarle la propiedad
identity.

Ejem: tenemos la tabla Usuario, esta sería su estructura:

Usuario
id int primary key identity
Nombre VARCHAR(20)
FechaNacimiento DateTime

De esta manera trabajamos los ID para nuestras tablas para que el EF lo reconozca por
defecto. Si queremos hacer una relación hacia otra tabla, debemos asignar un campo de
la siguiente manera Usuario_id. Por ende, etendiendo como EF maneja los ID podemos
comenzar a crear todas nuestras tablas y saltarnos al paso 3.

3- Recomiendo instalar el EF Tools el cual existe para la versión 2012 y 2013 de


nuestro visual studio. Con esto vamos a poder generar nuestras clases para trabajar
con el EF pero usando código puro.

Instalamos el EF Tools, y en nuestra visual studio en el explorador de soluciones, le


damos click derecho y agregar nuevo elemento, elegimos la opciòn que dice datos.

Image title

Elegimos ADO.NET Entity Data Model y la opción Code First, seteamos nuestra cadena de
conexión y elegimos las tablas a mapear.

Esta herramienta me va de lujo, ya que me crea un modelo bastante limpio. Veamos un


ejemplo:

namespace Data
{
using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 2/11
2/7/2019 Tips para llevarse bien con Entity Framework I

using Data.Entity;

public partial class ColegioContext : DbContext


{
public ColegioContext()
: base("name=ColegioContext")
{
}

public virtual DbSet<Curso> Curso { get; set; }


public virtual DbSet<Rol> Rol { get; set; }
public virtual DbSet<Usuario> Usuario { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)


{

}
}
}

Así obtenemos una clase Contexto bastante limpia y lista para comenzar a trabajar.

4- La jerarquía que uso para mis proyectos que usan EFPersonalmente yo dentro de mi
solución creo un nuevo proyecto para agregar nuestras entidades y accesos a datos
(consultas SQL).
La jerarquía que uso es la siguiente:

Data
-- Entity
----- Rol
----- Curso
----- Usuario
-- Model
----- UsuarioModel
----- RolModel
ColegioContext.cs

Entity: guardo mis entidades  que hacen referencia a las tablas.


Model: hago las consultas a la base de datos con cierta lógica de negocio.

El objetivo de esto es encapsular las reglas de negocio de nuestro proyecto en el


modelo y evitar tener que hacerlo en el controlador. ¿Que pasa si queremos replicar la
misma lógica de un controlador?, ¿Copiamos todo nuestro código de nuevo?

5- Para actualizar mis entidades que me genera el EF Tools, lo que hago es crear una
nueva carpeta y recrear todas las entidades de esta manera las remplazo por las
https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 3/11
2/7/2019 Tips para llevarse bien con Entity Framework I

anteriores.

5- La cadena de conexión siempre va en el webconfig, mi clase Context al incializar el


constructor hara referencia al connection string definido en el webconfig.

6- Cuando quiero agregar un campo adicional que no correspende a nuestra clase de


Entidad, simplemente agregamos la etiqueta [NotMapped] arriba de nuestro atributo. De
esta manera nuestro EF no lo va a considerar en el momento de inserción o
actualización.

7- Como hago un listado con el EF

public List<Usuario> Listar()


{
var usuarios = new List<Usuario>();

using (var context = new ColegioContext())


{
try
{
usuarios = context.Usuario
.Include( x => x.Rol)
.ToList();
}
catch (Exception e)
{

}
}

return usuarios;
}

8- Como hago un insert con el EF

public void Registrar(Usuario usuario)


{
using (var context = new ColegioContext())
{
try
{
context.Usuario.Add(usuario);
context.SaveChanges();
}
catch (Exception e)
{

https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 4/11
2/7/2019 Tips para llevarse bien con Entity Framework I

}
}

9- Como hago un update con el EF, como les dige el EF sabra que existe un atributo
llamado ID y por lo tanto sabra que es el PK de nuestra entidad y armar el query del
update correctamente usando como WHERE a nuestro atributo ID, si usan el sql profiler
se daran cuenta.

public void Actualizar(Usuario usuario)


{
using (var context = new ColegioContext())
{
try
{
context.Entry(usuario).State = EntityState.Modified;
context.SaveChanges();
}
catch (Exception e)
{

}
}
}

10- Como elimino un registro, nuevamente el EF sabra que el ID es el criterio tomado


para eliminar un registro determinado.

public void Eliminar(Usuario usuario)


{
using (var context = new ColegioContext())
{
try
{
context.Entry(usuario).State = EntityState.Deleted;
context.SaveChanges();
}
catch (Exception e)
{

}
}
}

11- Si quiero traer un solo registro lo que debemos hacer es lo siguiente:

public Usuario Obtener(int id)


{
https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 5/11
2/7/2019 Tips para llevarse bien con Entity Framework I

var usuario = new Usuario();

using (var context = new ColegioContext())


{
try
{
usuario = context.Usuario
.Where(x => x.id == id)
.SingleOrDefault();
}
catch (Exception e)
{

}
}

return usuario;
}

12- Si queremos eliminar ciertos registros en base a ciertas condiciones, lo que el EF


dice es que traigamos esos registros a eliminar primero y luego pasarselo para hacer
el DELETE, lo que yo digo es lo siguiente

context.Database.ExecuteSqlCommand("DELETE FROM Usuario WHERE id IN (@p0, @p1)", 1, 4);

Donde ejecuto en duro una consulta SQL y le paso parametros, estos parametros deben
empezar con p0, p1 asi sucesivamente, y el siguiente parametro del ExecuteSqlCommand
son los valores enviar de esta manera evitamos un SQL Injection

13- Como ejecuto un Storeprocedure, supongamos que tenemos un query bastante


complicado entonces le dejamos la tarea a nuestros procedures y lo que hacemos es
decirle al EF en que entidad quiero que mapee el resultado y que procedure debe
ejecutar. Ejemplo:

var Usuarios = context.Database.SqlQuery<Usuario>("USP_PROCEDURE_COMPLICADO_USUARIO @p0

De esta manera le digo que el resultado a obtener que debe coincidir con mi entidad
Usuario y quiero que sea una lista, es decir un List.

14- Transacciones con EF, en este enlace esta bien explicado


http://msdn.microsoft.com/en-us/data/dn456843.aspx, de todas formas te copio el código
de un ejemplo

https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 6/11
2/7/2019 Tips para llevarse bien con Entity Framework I

using (var ctx = new DBXContext())


{
using (var ctxTrans = ctx.Database.BeginTransaction())
{
try{
// Mi hermoso código aquí
ctxTrans.Commit(); // Aprobado
}catch (Exception){
ctxTrans.Rollback(); // Desaprobado
}
}
}

15- Muchas veces queremos actualizar ciertos campos dejando a un lado algunos, para
ignorar dichos campos hacemos lo siguiente:

// Dentro del contexto seteamos a false las 2 propiedades a continuación:


context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.ValidateOnSaveEnabled = false;

var eCS = ctx.Entry(cs);


eCS.State = EntityState.Modified;

// Quitamos los campos que no queremos actualizar


eCS.Property(x => x.Camion_id).IsModified = false;
eCS.Property(x => x.PESO_BRUTO).IsModified = false;
eCS.Property(x => x.VOLUMEN).IsModified = false;

ctx.SaveChanges();

Actualizado 28 de mayo, 2015.

12 Comentarios Anexsoft 
1 Acceder

 Recomendar 1 t Tweet f Compartir Ordenar por los mejores

Únete a la conversación...

INICIAR SESIÓN CON


O REGISTRARSE CON DISQUS ?

Nombre

Jaime Espinosa • hace un año


muy bueno, muy interesante y muy completo
17 △ ▽ • Responder • Compartir ›
https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 7/11
2/7/2019 Tips para llevarse bien con Entity Framework I

Eugenio Diaz R. • hace 4 años


Gracias esta muy interesante
2△ ▽ • Responder • Compartir ›

Anexsoft Moderador > Eugenio Diaz R. • hace 4 años


De nada doctor, para eso estamos ;)
△ ▽ • Responder • Compartir ›

Jose A. Urbina Gutierrez • hace un año


Excelentes tips a tomar en cuenta, son muy utiles para mantener organizado nuestro codigo y
realizar consultas de diferentes niveles de dificultad de varias maneras.
△ ▽ • Responder • Compartir ›

José Mata • hace un año


public class Registro
{
[Key]
public int RegistroID { get; set; }

public int FamiliaID { get; set; }


public virtual Familia Familia { get; set; }

public int GeneroID { get; set; }


public virtual Genero Genero { get; set; }

public int EspecieID { get; set; }


public virtual Especie Especie { get; set; }
public string NombreEspecie { get; set; }
}

Este código me da problema de múltiples cascadas, como podría a traves de codefirts


indicarle que el FK se update = NO ACTION delete NO ACTION?
△ ▽ • Responder • Compartir ›

Abel Aguero • hace un año • edited


Hola, muchas gracias por tus aportes, la verdad me ayudan mucho,... tengo un problema al
modificar un valor de mi base de datos en sql, éste surge al hacer el update, todo funciona
bien al momento de modificar los números positivos, el problema me da al momento de querer
modificar con un número negativo, sabes como puedo hacer para poder modificar con
números negativos, de antemano te agradezco, Saludos !!!
PD: estoy usando Entity Framework
foreach (var item in list)
{
var lectura = db.Nor_Lecturas.Where(x => x.Id_lectura == item.Id_lectura).First();
lectura.Lectura = item.Lectura;

db SaveChanges();
https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 8/11
2/7/2019 Tips para llevarse bien con Entity Framework I
db.SaveChanges();
}
△ ▽ • Responder • Compartir ›

Miguel Angel Ramirez Panduro • hace 2 años


Un éxito tu ejemplo... pero podrías poner un ejemplo si es que tu store no devuelve una
entidad pura sino un select de varias tablas
△ ▽ • Responder • Compartir ›

Michael • hace 2 años • edited


Profe como puedo guardar lo que estoy editando mis datos , por favor me puedes ayudar

AQUI TENGO MI METODO EDITAR ES PARA 3 TABLAS, el Modified me sale error

public ActionResult Edit([Bind(Include =


"HotelesId,CiudadesId,HOT_Nombre,HOT_Categoria,HOT_MnusValido,HOT_Swim,HOT_Wifi,
Hoteles hoteles,

[Bind(Include =
"HotelTarifasId,HTA_HabitacionSimple,HTA_PrecioHabSimple,HTA_HabitacionDoble,HTA_Prec
HotelTarifas HotelTarifa,

[Bind(Include =
"Hotel_CnxId,HOC_Repositorio,HOC_URL,HOC_Contacto,HOC_Email,HOC_RUC,HOC_Direc
Hotel_Cnx HotelCnx)

{
if (ModelState.IsValid)
{

ver más

△ ▽ • Responder • Compartir ›

haco haco • hace 2 años


y como lo hago si quiero guardar solo algunos campos que están en el modelo ?
△ ▽ • Responder • Compartir ›

Gustavo • hace 3 años


y como hago para actualizar varios registros a la vez pero que no sea con ID del la entidad
sino otro campo, por ejemplo where ID(este va por defult) and campo2='VALOR' , campo2 es
una condicion mas , como hago para agregar esto?
△ ▽ • Responder • Compartir ›

Jorge N. • hace 2 años


Hola Anexsoft muchas gracias por tu conocimiento es bastante bueno, te preguntaría, cómo
sería la sentencia para poder editar una entidad o objeto con todas sus propiedades y demás
objetos con un simple Edit, es posible?, Es tan sencillo como en el Add que solo envías el
objeto con todas sus propiedades llenas y sus listas tambien llenas(objetos de relación) y solo
https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 9/11
2/7/2019 Tips para llevarse bien con Entity Framework I
objeto con todas sus propiedades llenas y sus listas tambien llenas(objetos de relación) y solo
dejando el campo ID en todos los objetos en 0. Funciona igual para el Edit?
△ ▽ • Responder • Compartir ›

FABIO GERMAN Voigt • hace 4 años


y que pasa si en mi base de datos no tengo un "id int primary key identity". que diferencia hay
con trabajar con linq , ado.net puro como leí por ahi y entity framework, cual es mejor, cual
conviene. perdon por pregunta, me estoy iniciando en el tema. por último para empezar desde
cero con el el acceso a una base de datos con c# por donde me recomiendas iniciar el
aprendisaje? muchas gracias.
△ ▽ • Responder • Compartir ›

TAMBIÉN EN ANEXSOFT

Principios de SOLID con ejemplos (C#) Autenticación JWT usando ASP.NET Core
5 comentarios • hace 2 años 10 comentarios • hace un año
Jose Magdaleno Gonzalez Romero — Muy Ales Florez — Que buen articulo, muchas
bueno, explicas bien un tema complejo en gracias.

¿TE GUSTÓ NUESTRA PUBLICACIÓN?


SUSCRÍBETE A NUESTRO BOLETÍN

Nombre E-mail Suscribirse

SÍGUENOS EN SOBRE NOSOTROS


Somos un blog de
   tecnología que pertenece a
KODOTI y busca compartir
© 2019 Anexsoft - blog
oficial de KODOTI.  conocimiento a través de

https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 10/11
2/7/2019 Tips para llevarse bien con Entity Framework I

sus constantes
 ¿Quieres colaborar con publicaciones.
el blog?
 Web Developers FullStack
 KODOTI

https://anexsoft.com/tips-para-llevarse-bien-con-entity-framework-i 11/11

Das könnte Ihnen auch gefallen