Crear Entidad Simple

36
15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 1/36 sábado, 29 de junio de 2013 [Entity Framework][Code First] Crear entidad simple Introducción Este artículo sea el inicio de varios donde iremos analizando paso a paso las diferentes alternativas que Entity Framework nos brinda en su modalidad Code First. Partiremos de ejemplos simples hasta analizar implementaciones mas complejas, evaluando como se generan las consultas que impactaran en la base de datos. Haremos uso de la estructura planteada por la db NorthWind, agregándole algunas modificaciones para poder estudiar algunos casos no contemplados en el modelo original, como ser el caso de la herencia. Comenzaremos armando la estructura del proyecto, el cual no contara con ninguna interfaz grafica ya que haremos uso de proyectos de Test para aplicar validar la lógica que permite recuperar los datos. También armaremos el código haciendo uso del concepto de Repository dejando encapsulado la funcionalidad de Entity Framework a un solo proyecto. Incluir librería Proyecto La estructura esta formado por 3 proyecto: Test, el cual permitirá probar la funcionalidad y evaluar el correcto desarrollado DataAccess, donde se definen las clases repository, así como también el contexto que requiere Code First para mapear las entidades Entities, define las clases que representan las entidades de negocio Archivo del blog 2014 (5) 2013 (25) diciembre (2) noviembre (1) octubre (1) septiembre (1) agosto (3) julio (4) junio (2) [Entity Framework] [Code First] Complex Type [Entity Framework] [Code First] Crear entidad simpl... mayo (5) marzo (2) febrero (3) enero (1) 2012 (24) 2011 (23) 2010 (55) 2009 (22) 2008 (1) More Next Blog» [email protected] Dashboard Sign Out Leandro Tuttini Blog

Transcript of Crear Entidad Simple

Page 1: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 1/36

sábado, 29 de junio de 2013[Entity Framework][Code First] Crearentidad simple

Introducción

Este artículo sea el inicio de varios donde iremos analizandopaso a paso las diferentes alternativas que Entity Frameworknos brinda en su modalidad Code First.

Partiremos de ejemplos simples hasta analizarimplementaciones mas complejas, evaluando como segeneran las consultas que impactaran en la base de datos.

Haremos uso de la estructura planteada por la dbNorthWind, agregándole algunas modificaciones para poderestudiar algunos casos no contemplados en el modelooriginal, como ser el caso de la herencia.

Comenzaremos armando la estructura del proyecto, el cualno contara con ninguna interfaz grafica ya que haremos usode proyectos de Test para aplicar validar la lógica quepermite recuperar los datos.

También armaremos el código haciendo uso del concepto deRepository dejando encapsulado la funcionalidad de EntityFramework a un solo proyecto.

Incluir librería Proyecto

La estructura esta formado por 3 proyecto:

Test, el cual permitirá probar la funcionalidad yevaluar el correcto desarrolladoDataAccess, donde se definen las clases repository,así como también el contexto que requiere Code Firstpara mapear las entidadesEntities, define las clases que representan lasentidades de negocio

Archivo del blog

2014 (5)

2013 (25) diciembre (2)

noviembre (1)

octubre (1)

septiembre (1)

agosto (3)

julio (4)

junio (2)[Entity Framework][Code First]Complex Type

[Entity Framework][Code First] Crearentidad simpl...

mayo (5)

marzo (2)

febrero (3)

enero (1)

2012 (24)

2011 (23)

2010 (55)

2009 (22)

2008 (1)

More Next Blog» [email protected] Dashboard Sign Out

Leandro Tuttini Blog

Page 2: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 2/36

en la capa de DataAccess es donde necesitaremosreferenciar la librería de Entity Framework, para elloharemos uso de NuGet

Datos personales

LEANDRO TUTTINI

Seguir1.622

Ver todo mi perfil

Microsoft MVP C# 2010 2014

Etiquetas

ADO.NET (12)

ASP.NET (35)

ASP.NET MVC (3)

C# (35)

Crystal Reports (5)

DataGridView (13)

Dynamic CRM (5)

Entity Framework (14)

GridView (12)

JavaScript (1)

jQuery (13)

Linq (6)

MS Access (2)

MVP (2)

NTier (6)

NHibernate (1)

Office (1)

Reporting Service (2)

VB.NET (5)

Visual Studio (3)

WinForm (36)

Seguidores

Page 3: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 3/36

Una vez instalada la librería podremos verla comoreferencia en el proyecto

Definir conexión a la Base de Datos

Para poder usar EF debemos definir la cadena de conexiónen un archivo App.config o Web.config según sea el tipo deproyecto que se este usando, en este caso al ejecutar desdeun Test será un App.config con el siguiente contenido:

El name de la key de la conexión se utilizara en la definiciónde la clase del contexto.

<?xml version="1.0" encoding="utf‐8" ?><configuration>

<connectionStrings>

<add name="NorthwindDb"connectionString="Data Source=(local);Initial

Catalog=Northwind;IntegratedSecurity=SSPI;"

providerName="System.Data.SqlClient"/></connectionStrings>

</configuration>

Page 4: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 4/36

En este caso vamos a utilizar el servicio de Sql Server y noun attach dinámico porque dejaremos que el modelo definidoen EF genere la base de datos, de esta forma se podráanalizar la estructura de tablas resultante.

Si la base de datos existe previamente (salvo que se loindique lo contrario) usara esa db, sino la creara basándoseen la estructura definida en el modelo.

Definición del contexto

El proyecto encargado de definir la persistencia será:NorthWind.DataAccess

Empezaremos creando la clase de contexto:NorthWindDataContext

La clase hereda de DbContext, y define en el constructor lakey del archivo de configuración que usara para tomar laconexión a la base de datos.

Por cada entidad que necesitemos mapear con una tabla secreara una propiedad cuyo tipo será DbSet<>

Dejamos preparado el contexto con la definición delOnModelCreating donde podremos personalizar el mapeo de

public class NorthWindContext : DbContext

public NorthWindContext(): base("NorthwindDb")

public DbSet<Category> Categories get; set;

protected override void

OnModelCreating(DbModelBuilder modelBuilder)

base.OnModelCreating(modelBuilder);

Page 5: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 5/36

la entidad, esto lo veremos mas adelante.

Definición del Repositorio Genérico

La clase del repositorio permitirá definir las acciones sobrela persistencia que serán comunes para todas las entidades.

Comenzaremos definiendo la interfaz del repositorio:

La implementación base

interface IRepository<T> where T:class

List<T> GetAll();List<T> GetAll(List<Expression<Func<T, object>>>

includes);

T Single(Expression<Func<T, bool>> predicate);T Single(Expression<Func<T, bool>> predicate,

List<Expression<Func<T, object>>> includes);

List<T> Filter(Expression<Func<T, bool>> predicate);List<T> Filter(Expression<Func<T, bool>> predicate,

List<Expression<Func<T, object>>> includes);

void Create(T entity);void Update(T entity);

void Delete(T entity);void Delete(Expression<Func<T, bool>> predicate);

public abstract class BaseRepository<T> : IRepository<T>where T:class

public List<T> GetAll()

using (NorthWindContext context = newNorthWindContext())

return (List<T>)context.Set<T>().ToList();

public List<T> GetAll(List<Expression<Func<T,

object>>> includes)

List<string> includelist = new List<string>();

foreach (var item in includes)

MemberExpression body = item.Body asMemberExpression;

if (body == null)throw new ArgumentException("The body

must be a member expression");

includelist.Add(body.Member.Name);

using (NorthWindContext context = new

NorthWindContext())

DbQuery<T> query = context.Set<T>();

includelist.ForEach(x => query =

Page 6: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 6/36

includelist.ForEach(x => query =query.Include(x));

return (List<T>)query.ToList();

public T Single(Expression<Func<T, bool>> predicate)

using (NorthWindContext context = newNorthWindContext())

return context.Set<T>

().FirstOrDefault(predicate);

public T Single(Expression<Func<T, bool>> predicate,List<Expression<Func<T, object>>> includes)

List<string> includelist = new List<string>();

foreach (var item in includes)

MemberExpression body = item.Body asMemberExpression;

if (body == null)throw new ArgumentException("The body

must be a member expression");

includelist.Add(body.Member.Name);

using (NorthWindContext context = new

NorthWindContext())

DbQuery<T> query = context.Set<T>();

includelist.ForEach(x => query =query.Include(x));

return query.FirstOrDefault(predicate);

public List<T> Filter(Expression<Func<T, bool>>predicate)

using (NorthWindContext context = new

NorthWindContext())

return (List<T>)context.Set<T>().Where(predicate).ToList();

public List<T> Filter(Expression<Func<T, bool>>

predicate, List<Expression<Func<T, object>>>includes)

List<string> includelist = new List<string>();

foreach (var item in includes)

MemberExpression body = item.Body asMemberExpression;

if (body == null)throw new ArgumentException("The body

Page 7: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 7/36

throw new ArgumentException("The bodymust be a member expression");

includelist.Add(body.Member.Name);

using (NorthWindContext context = newNorthWindContext())

DbQuery<T> query = context.Set<T>();

includelist.ForEach(x => query =

query.Include(x));

return(List<T>)query.Where(predicate).ToList();

public void Create(T entity)

using (NorthWindContext context = newNorthWindContext())

context.Set<T>().Add(entity);context.SaveChanges();

public void Update(T entity)

using (NorthWindContext context = newNorthWindContext())

context.Entry(entity).State =

EntityState.Modified;context.SaveChanges();

public void Delete(T entity)

using (NorthWindContext context = newNorthWindContext())

context.Entry(entity).State =

EntityState.Deleted;context.SaveChanges();

public void Delete(Expression<Func<T, bool>>

predicate)

using (NorthWindContext context = newNorthWindContext())

var entities = context.Set<T>

().Where(predicate).ToList();entities.ForEach(x =>

context.Entry(x).State =EntityState.Deleted);

context.SaveChanges();

Page 8: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 8/36

Como se puede observar en este caso el repositorio defineun contexto fijo para no complicar la implementación, perose podría hacer uso de algún framework de IoC parainyectar el contexto ha utilizar.

Creación de una entidad simple

Para empezar vamos a hacer uso de una entidad muysimple, definiéndola en el proyecto: NorthWind.Entities

Se trata de una entidad que define categorías

Definición del Repositorio especifico para al entidad

Es necesario implementar un repositorio para la entidadhaciendo uso del base.

public class Category

public int CategoryID get; set;

public string CategoryName get; set; public string Description get; set;

public interface ICategoryRepository

Category GetById(int categoryID); public class CategoryRepository :

BaseRepository<Category>, ICategoryRepository

public Category GetById(int categoryID)

using (NorthWindContext context = newNorthWindContext())

return context.Set<Category>

().FirstOrDefault(x => x.CategoryID ==categoryID);

Page 9: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entidad… 9/36

En esta entidad se puede especializar funcionalidad que senecesites puntualmente, en el ejemplo se implemento unmétodo que devuelve la entidad según su id, el método esdefinido no solo en la clase concreta del repositorio, sinoque se especifica una interfaz ICategoryRepository parapermitir cambiar la implementación en caso de sernecesario (o si se utiliza algún IoC).

Por supuesto siempre existen alternativas, el métodoGetById() podría haberse omitido ya que el mismo datopodría haberse recuperado mediante la el método Single()que define el repositorio base, utilizando:

Ese método GetById() es solo un ejemplo que pretendedemostrar como se puede extender la funcionalidad definidaen el repositorio base, en este no se definieron los métodoscomo virtual para poder sobrescribirlos, pero podría hacersesin inconveniente.

Test de categorías

Para validar el funcionamiento de lo codificado hasta elmomento crearemos un test que nos ayude.

En el proyecto EF.Test definimos la clase CategoryTest

Al ejecutar el Test si la base de dato no existe EF la crearapor nosotros, en este caso la tabla de categorías define loscampos:

CategoryRepository repository = newCategoryRepository();

Category category = repository.Simple(x=>x.CategoryID ==

categoryId);

[TestMethod]public void Get_All_Category()

CategoryRepository repoCategory = newCategoryRepository();

Category categoryNew = new Category()

CategoryName = "CatName1",Description = "Desc1"

;repoCategory.Create(categoryNew);

var categoryList = repoCategory.GetAll();

Assert.AreEqual(categoryList.Count, 1);

Page 10: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 10/36

EF define convenciones que pueden utilizarse para no tenerque configurar nada de la entidad, por ejemplo si definimosuna propiedad que lleve el nombre de la entidad mas ID,esta automáticamente será tomada como clave.

Cambiar estructura tabla

Cualquier diferencia con lo especificado en la conversiónrequiere definición, es aquí donde entra en juego elOnModelCreating.

En la siguiente código se agrega al contexto la especificacióna las propiedades de la entidad

public class NorthWindContext : DbContext

public NorthWindContext(): base("NorthwindDb")

public DbSet<Category> Categories get; set;

protected override void

OnModelCreating(DbModelBuilder modelBuilder)

modelBuilder.Configurations.Add(newCategoryMap());

base.OnModelCreating(modelBuilder);

public class CategoryMap :

EntityTypeConfiguration<Category>

public CategoryMap()

ToTable("Categories");

HasKey(c => c.CategoryID);Property(c =>

c.CategoryID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Page 11: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 11/36

Al ejecutar nuevamente el Test la definición de la tablahabrá cambiado:

En este caso especificar la clave como identity esredundante, ya que por convención EF puede deducirlo,aunque es bueno conocer las opciones de mapping para loscasos en donde no se ajuste a la convención.

Análisis de las consulta (Sql Profiler)

Para poder validar las consultas que Entity Frameworkgenera contra la base de datos será necesario utilizar el SqlProfiler

Una vez ejecutada la aplicación el primer paso crea unnuevo Trace

En el cuadro de configuración podremos definir un nombredel trace, además de los filtros y columnas de informaciónque necesitemos para realizar el seguimiento, en este elcombo “Use the template” se selecciono un témplate quesolo nos muestre los datos relativos a las consultas sql

Property(c =>

c.CategoryName).IsRequired().HasMaxLength(15);

Property(c =>c.Description).HasColumnType("ntext");

Page 12: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 12/36

También se define el nombre de la base de datos quenecesitamos analizar, esto lo conseguimos mediante ladefinición de un filtro.

El ultimo paso solo será inicia el trace con el botón “Run”

Obtener todas las entidades

Empezaremos definiendo un test que no permita validar elrecuperar todas las entidades registradas.

[TestMethod]public void Get_All_Category()

CategoryRepository repoCategory = new

Page 13: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 13/36

si analizamos en el Sql Profiler veremos que EF genera laquery

En el ejemplo se instancia al repositorio directamente y seutilizan los métodos para crear o recuperar la entidad.

Obtener una entidad por el ID

Se hará uso del método Single() definido en el repositoryindicando el lambda que filtrara la entidad por el ID

CategoryRepository repoCategory = newCategoryRepository();

Category categoryNew = new Category()

CategoryName = "CatName1",Description = "Desc1"

;repoCategory.Create(categoryNew);

var categoryList = repoCategory.GetAll();

Assert.AreEqual(categoryList.Count, 1);

[TestMethod]public void Get_SingleById_Category()

CategoryRepository repoCategory = newCategoryRepository();

Category categoryNew = new Category()

CategoryName = "CatName1",Description = "Desc1"

;repoCategory.Create(categoryNew);

var categorySel = repoCategory.Single(x =>

x.CategoryID == categoryNew.CategoryID);

Assert.IsNotNull(categorySel);Assert.AreEqual(categorySel.CategoryID,

categoryNew.CategoryID);Assert.AreEqual(categorySel.CategoryName,

categoryNew.CategoryName);Assert.AreEqual(categorySel.Description,

categoryNew.Description);

Page 14: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 14/36

La query que genera EF en el profiler será

Se puede apreciar claramente la definición del filtro en elWHERE al cual se le asigna el parámetro del Id

Eliminar una entidad

Para eliminare la entidad simplemente hace falta definir elid de la misma, no es obligatorio recuperar la entidad parapoder eliminarla

En este caso como estamos en un mismo test method dondese crea y elimina en una misma secuencial para podervalidar el código no tenga tanto sentido, pero es necesarioentender que con solo crear una nueva entidad en dondesolo se asigne el id alcanza para poder llevar a cabo lafinalidad.

[TestMethod]public void Delete_ById_Category()

CategoryRepository repoCategory = newCategoryRepository();

////creamos una nueva categoria//Category categoryNew = new Category()

CategoryName = "CatName2",Description = "Desc2"

;repoCategory.Create(categoryNew);

////la eliminamos//repoCategory.Delete(new Category() CategoryID =

categoryNew.CategoryID );

//// se recupera para validar que no exista//var categorySel =

repoCategory.GetById(categoryNew.CategoryID);

Assert.IsNull(categorySel);

Page 15: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 15/36

En la definición del test se crea una entidad nueva, pero solose utiliza el id para crear una entidad nueva que se adjuntaal contexto para poder asignar el estado

context.Entry(entity).State = EntityState.Deleted;

analizando con el profiler podremos ver como EF genera lainstrucción sql para eliminar el registro

Código

El código fue confeccionado con Visual Studio 2012,utilizando Entity Framework 5

La base de datos es creada de forma automática por elmismo Entity Framework, solo es necesario definir elconnectionstring al servicio de sql server

[C#]

Publicado por Leandro Tuttini en 11:25

Etiquetas: Entity Framework

73 comentarios:

Patos dijo...muy pero muy bueno Leo!!!10 de julio de 2013, 5:15

Unknown dijo...Buenas tardes Leandro; ando buscando un articulotuyo que publicaste sobre como dar mantenimiento auna datagridview c# con entity Framework. Saludos16 de julio de 2013, 14:27

Leandro Tuttini dijo...

Page 16: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 16/36

hola Unknown

no he creado ningun articulo que una el datagridviewy EF

por ahora en los articulos solo trato EF Code Fisrtdesde Test

saludos17 de julio de 2013, 6:00

Unknown dijo...

Maestro sigo tus publicaciones desde hace un par deaños y no he tenido oportunidad de agradecerte porcompartir tus conocimientos. Me has iluminado enmuchas ocaciones y eso se agradece.GRACIAS TOTALES27 de julio de 2013, 12:35

CESAR RIVERA dijo...

Muy buenas Leandro, a ver si me das una mano. Hecreado 4 tablas con CodeFirst, EF 5.0.0, VS2010, enlas que no he seguido las convenciones para llavesprimarias, y todo bien. En la siguiente tengoproblema, que un campo es llave primaria y a la vezes llave foránea (primaria en otra tabla). El mensajedice: The navigation property 'CodDeptoPais' is not adeclared property on type 'Lotificacion'. Verify that ithas not been explicitly excluded from the model andthat it is a valid navigation property. Tuve que ponerfreno aquí, porque encuentro como resolverlo. En lasprimeras 4 tablas no tuve problema. ¿existe algúnejemplo que pueda seguir, sin usar convenciones paranombres de llaves?, porque los campos llave estánpredefinido de cierta longitud, tipo string, ycombinados no deben repetirse.Saludos, y de antemano gracias.12 de agosto de 2013, 17:11

Leandro Tuttini dijo...

hola CESAR

es una relacion uno a muchos la que quiere definir, no?

como defines en la clase Map el HasRequired oHasOptional

porque alli debes indicar cuales son las propiedadesque permiten la navegacion

[Entity Framework][Code First] Asociación uno amuchos (1/3)

saludos13 de agosto de 2013, 9:29

Page 17: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 17/36

GabrieL dijo...

Muchas gracias, muy KISS la explicacion ;)17 de agosto de 2013, 11:37

Sergio Maldonado dijo...Hola Leandro, buenas noches, primero que nada paraagradecerte la ayuda que nos brindas con estos temasque, para los que vamos empezando con mvc son demucha ayuda.

Tengo una duda, y no se sí me la pudieras aclarar,estoy desarrollando una aplicación con mvc4 y lamanera de hacer la relación con la bd es bd first, todofunciona a la perfección y ya casi término la primeraetapa del proyecto, el problema es que necesito estarcreando más tablas con forme avanza el proyecto,entonces al actualizar el modelo EF en mi sistema,me actualiza mis modelos en los cuales ya tengo misvalidaciones, textos para los campos y necesito evitarque esto esté sucediendo, por que lo que hago ahoritaes hacer un backup de los mismos y luego losrestauro, he estado buscando que pudiera hacer parasolucionar esto, y no encuentro un alternativa, sabesde algo que me pudiera ser de utilidad?

De antemano muchas gracias!27 de agosto de 2013, 21:35

Leandro Tuttini dijo...hola Sergio

se que el codigo que genera EF define las clases comopartial por lo que podrias crear un .cs separadodefinir alli una clase con el mismo nombre a lagenerada por EF y extender la funcionalidad

si el tema son las validaciones de DataAnnotationpodrias implementar

http://fluentvalidation.codeplex.com/

aqui no uses atributos, sino que defines lasvalidaciones en clases separada con fluent validation,asi no tendras problemas si el modelo se actualiza lasvalidaciones estaran separadas

Integration with ASP.NET MVC

saludos27 de agosto de 2013, 23:14

JuanFa dijo...Buenos días! Quisiera que por favor explicaras unpoco como funcionan los métodos que tienen porparámetro la lista 'List>> includes' y cual sería suutilidad, es decir como se generaría esa lista deexpressions y luego que función cumpliría en alguno

Page 18: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 18/36

de los métodos que la reciben como parámetro.Desde ya gracias!16 de septiembre de 2013, 19:13

Leandro Tuttini dijo...

hola JuanFa

el include se define para optimizar la accion derecuperar entidades relacionadas, recuerda que alusar un repositorio no habilitamos lazy load, por loque se debe especificar de antemano que entidadesasociadas se van a utilizar

por ejemplo si recupero una categoria y se requierelos productos asociados se debe indicar en el include,sino la lista de producto nunca se cargara

explicar como funciona un expresion tree puede seralgo largo

Expression Trees (C# and Visual Basic)

Expression Tree Basics

la idea es poder definir un lambda que pueda serparseado he interpretado, en este caso para obtenerla propiedad que se requiere incluir en la query de EF

saludos16 de septiembre de 2013, 23:20

IMANOL IZA MARTIN dijo...

Hola Leandro, Muchas gracias por el post, esta genial!Tengo una duda:En la distribucion de los proyectos, has puestoEntities, DataAccess para el contexto y patronrepositorio, etc..en el caso de un proyecto de MVC el controladordonde estarian en otro proyecto? y las interfaces consus implementaciones de las entidades en el de dataaccess?

muchas gracias de antemano17 de septiembre de 2013, 9:02

JuanFa dijo...

Estuve leyendo un poco lo que linkeaste y aún intentoentender como funcionan las expresiones lambda je..En tu ej:

new List>>() x => x.Category, x => x.Supplier );

Si quisiera mostrar los datos de esas entidadesasociadas a Producto (Categoria y Proveedor) como loharías? Digo utilizando las funciones que ya tienes enel repositorio.. la consulta es la esa misma y hay quetrabajar en otro lado para recuperar los datos de las

Page 19: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 19/36

entidades asociadas? O hay que modificar esaconsulta? Desde ya muchas gracias!17 de septiembre de 2013, 9:57

Leandro Tuttini dijo...

hola IMANOL IZA MARTIN

el controlador es parte del patron MVC por lo que vaen la capa de presentacion, tiene que estar en elmismo proyecto web

las entidades van separadas a la implementacion delrepositorio, si puede definir la interfaz del repositorioen el mismo proyecto donde defines als interfaces,pero la implementacion del repositorio va en otroproyecto

saludos23 de septiembre de 2013, 0:02

Leandro Tuttini dijo...

hola JuanFa

asi como lo defines esta correcto

new List<Expression<Func<Product, object>>>() x=> x.Category, x => x.Supplier

recuerda applicar un encoding cuando pones codigoasi se puede visualizar http://www.opinionatedgeek.com/DotNet/Tools/HTMLEncode/Encode.aspx

saludos23 de septiembre de 2013, 0:08

IMANOL IZA MARTIN dijo...

Perfecto! Entonces si te he entendido bien seria algoasí?

EF.Test CategoryTest.csEjemploMVCWebAPI ICategoryRepository.cs CategoryRepository.cs CategoryController.csNorthWind.DataAccess IRepository.cs BaseRepository.cs NorthWindDataContext.csNorthWind.Entities Category.cs

Gracias de antemano! un saludo.25 de septiembre de 2013, 3:06

Leandro Tuttini dijo...

Page 20: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 20/36

hola IMANOL

lo que veo es que el repositorio concretos, en estecaso de categoria, no deberia estar junto a loscontroladores de webapi

quizas deberian estar en un proyecto separado

saludos25 de septiembre de 2013, 11:00

Luis Ormeño dijo...

Hola Leandro.

Estoy probando tu codigo e incluso he ejecutado tuejemplo y en ambos tengo el mismo error al ejecutarel Test :et_All_Category has failed:El método de inicializaciónEF.Test.CategoryTest.inicializar produjo unaexcepción.System.Data.ProviderIncompatibleException:System.Data.ProviderIncompatibleException: An erroroccurred while getting provider information from thedatabase. This can be caused by Entity Frameworkusing an incorrect connection string. Check the innerexceptions for details and ensure that the connectionstring is correct. >System.Data.ProviderIncompatibleException: Elproveedor no devolvió una cadena deProviderManifestToken. >System.Data.SqlClient.SqlException: Error de inicio desesión del usuario 'MACOSA\lormeno'..d:\Macosac\EFExample\EFExample\NorthWind.DataAccess\DbHelper.cs(15, 0) :NorthWind.DataAccess.DbHelper.CreateDb()d:\Macosac\EFExample\EFExample\EF.Test\CategoryTest.cs(15, 0) : EF.Test.CategoryTest.inicializar()

Get_SingleById_Category has failed:El método de inicializaciónEF.Test.CategoryTest.inicializar produjo unaexcepción.System.Data.ProviderIncompatibleException:System.Data.ProviderIncompatibleException: An erroroccurred while getting provider information from thedatabase. This can be caused by Entity Frameworkusing an incorrect connection string. Check the innerexceptions for details and ensure that the connectionstring is correct. >System.Data.ProviderIncompatibleException: Elproveedor no devolvió una cadena deProviderManifestToken. >System.Data.SqlClient.SqlException: Error de inicio desesión del usuario 'MACOSA\lormeno'..d:\Macosac\EFExample\EFExample\NorthWind.DataAccess\DbHelper.cs(15, 0) :NorthWind.DataAccess.DbHelper.CreateDb()d:\Macosac\EFExample\EFExample\EF.Test\CategoryTest.cs(15, 0) : EF.Test.CategoryTest.inicializar()

Page 21: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 21/36

Get_ById_Category has failed:El método de inicializaciónEF.Test.CategoryTest.inicializar produjo unaexcepción.System.Data.ProviderIncompatibleException:System.Data.ProviderIncompatibleException: An erroroccurred while getting provider information from thedatabase. This can be caused by Entity Frameworkusing an incorrect connection string. Check the innerexceptions for details and ensure that the connectionstring is correct. >System.Data.ProviderIncompatibleException: Elproveedor no devolvió una cadena deProviderManifestToken. >System.Data.SqlClient.SqlException: Error de inicio desesión del usuario 'MACOSA\lormeno'..d:\Macosac\EFExample\EFExample\NorthWind.DataAccess\DbHelper.cs(15, 0) :NorthWind.DataAccess.DbHelper.CreateDb()d:\Macosac\EFExample\EFExample\EF.Test\CategoryTest.cs(15, 0) : EF.Test.CategoryTest.inicializar()

Delete_ById_Category has failed:El método de inicializaciónEF.Test.CategoryTest.inicializar produjo unaexcepción.System.Data.ProviderIncompatibleException:System.Data.ProviderIncompatibleException: An erroroccurred while getting provider information from thedatabase. This can be caused by Entity Frameworkusing an incorrect connection string. Check the innerexceptions for details and ensure that the connectionstring is correct. >System.Data.ProviderIncompatibleException: Elproveedor no devolvió una cadena deProviderManifestToken. >System.Data.SqlClient.SqlException: Error de inicio desesión del usuario 'MACOSA\lormeno'..d:\Macosac\EFExample\EFExample\NorthWind.DataAccess\DbHelper.cs(15, 0) :NorthWind.DataAccess.DbHelper.CreateDb()d:\Macosac\EFExample\EFExample\EF.Test\CategoryTest.cs(15, 0) : EF.Test.CategoryTest.inicializar()

Saludos29 de octubre de 2013, 15:27

Leandro Tuttini dijo...

hola Luis

pero el error esta muy claro, y dice:

Error de inicio de sesión del usuario'MACOSA\lormeno'

valida el connection string porque no estas pudiendoconectarte al sql server

saludos

Page 22: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 22/36

30 de octubre de 2013, 4:12

Luis Ormeño dijo...

Muchas gracias Leandro, no me percate de ello,funciono a la perfección luego de la corrección de mierror.

Saludos

Luis30 de octubre de 2013, 17:39

Luis Ormeño dijo...

Muchas gracias Leandro, no me percate de ello,funciono a la perfección luego de la corrección de mierror.

Saludos

Luis30 de octubre de 2013, 17:40

ksoto dijo...

Leandro buenos dias sigo tus publicaciones, estoyempezando con Netito y viendo este articulo¡descargue el ejemplo pero la verdad no pudeejecutarlo dpronto no se como puesto que me diceque una librería no puede ser iniciada, si puedesayudarme te agradezco quiero probar y ver tuejemplo para entenderlo mejor14 de noviembre de 2013, 8:20

Leandro Tuttini dijo...

hola ksoto

obtienes algun error cuando ejecutas ?imagino lo que corres son los test

validaste la conexion a la base de datos? el serviciode sql server este iniciado y las credenciales deacceso sean correctas

saludos15 de noviembre de 2013, 2:39

ksoto dijo...

si lo que pasa es que configuro el app.config y loejecuto como cualquier aplicacion creada es decir conf5 o con el iniciar, pero no se si asi no se inicia untest me gustaria que me explicaras por favor comohago para ver corriendo este test15 de noviembre de 2013, 22:18

Leandro Tuttini dijo...

hola ksoto

Page 23: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 23/36

para ejecutar el test podrias ayudarte con ventana del"Text Explorer"

How to: Run Automated Tests from Microsoft VisualStudio

desde alli ejecutas y pudes ver tambien si lo hicieroncorrectamente

saludos18 de noviembre de 2013, 4:00

ksoto dijo...

Leandro ya lo pude ejecutar, estoy creando unproyecto para aprender pero me surgió una pequeñaduda, como puedo crear solo la base de datos sinregistros, lo intente llamando el método CreateDB dela clase DBHelper pero no ejecuta nada.18 de noviembre de 2013, 21:03

ksoto dijo...

Me gustaria crear la base de datos pero sin tener queinsertarle un registro como lo podria hacer18 de noviembre de 2013, 22:12

Leandro Tuttini dijo...

hola ksoto

que raro, porque si creas un test que no hace nadasolo incoca al inicializar este deberia generar la basede datos

podrias sino usar migratios

Automatic Code First Migrations

o sea por linea de comando desde la consola de nugetpodrias ejecutar la creacion o actualizacion de la db

saludos20 de noviembre de 2013, 10:46

ksoto dijo...

Leandro buenas noches estoy creando una aplicaciony me genera el siguiente mensaje "Unable todetermine the principal end of an association betweenthe types 'Entidades.ControlTriage' and'Entidades.Centros'. The principal end of thisassociation must be explicitly configured using eitherthe relationship fluent API or data annotations."24 de noviembre de 2013, 20:21

Leandro Tuttini dijo...

hola ksoto

Page 24: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 24/36

que tipo de relacion se trata, es uno a mucho omuchos a muchos ?

en el mapping de alguna de las entidades defines larelacion de asociacion?porque parece ser que algo no puede determinar pormedio de la convencion y requiere que lo definas

saludos26 de noviembre de 2013, 3:41

Ing. Martin Del Villar dijo...

Ocupo tu ayuda urgente Leandro la razón es quetengo un sitio con conexión entity framework codefirst el problema es que al hacer un cambio ya seagregar una propiedad en la clase si hago el cambiomanual en la base de datos osea agregar ese campoen la tabla con las mismas especificaciones no mefunciona y ps obviamente no quiero que borre la basede datos y me la cree de nuevo si no que actualice laentidad con el cambio nomas esto sucede con elhecho de ponerle requerido o cualquier cambio estoymuy perdido AYUDAA mi correo [email protected] de noviembre de 2013, 9:36

Tonkyfiero dijo...

Hola buenas tardes, una pregunta no tendras algunejemplo ,donde apliques code first pero a una base dedatos existente, y que tu clases se mapeen con labase.

saludos29 de noviembre de 2013, 12:26

Leandro Tuttini dijo...

hola Martin

si vambias algo en la db no se actualiza tu modelo enel codigo de forma automatica, eres tu quien debeaplicar el cambio

no existe esto de aplicar el cambio que realices en ladb en la entidad en el codigo

la actualizacion automatica puede configurarse en unsolo sentido desde el codigo hacia los datos, pero noes automatica en el otro sentido debes aplicar tu loscambios en el mapping

saludos2 de diciembre de 2013, 3:27

Leandro Tuttini dijo...

hola Tonkyfiero

la unica diferencia es que usarias el

Page 25: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 25/36

public class NorthWindContext : DbContext

public NorthWindContext(): base("NorthwindDb")Database.SetInitializer<NorthWindContext>(null);

..

el SetInitializer para que no actualice o cree la db, asiusa la existente

saludos2 de diciembre de 2013, 3:33

cquispe dijo...

Buenas tardes leandro; primeramente agradecertepor la ayuda que nos brindas.Acabo de leer detenidamente esta publicación, perome surgió las siguientes dudas.En que consiste y para que se define el repositoriogenérico?En que capa se debe crear el repositorio genérico y elrepositorio especifico?Es correcto que las clases que se definen parapersonalizar el mapeo de las entidades, se definan enel mismo archivo donde se define el contexto. O seriamejor definir en otro archivo, Si es así por cadaentidad se tiene crear un archivo, y en que capadebería ir estes archivos?De antemano le agradesco la ayuda......10 de enero de 2014, 14:00

Leandro Tuttini dijo...

hola cquispe

el repositorio generico tiene como objetivoimplementar funcionalidad base que sera comun a lasdiferentes implementaciones especificashay funcionalidad que es la misma sin importar deque entidad se trate, entonces para no repetir elcodigo se crea la implementacion base para todas

un repositorio siempre tiene que estar en la capa dedatos

la ubicacion de la definicion del mapping no se veafectada por el lugar donde la defines, podriashacerlo en el mismo archivo o separados amboscaminos son validosquizas lo que determina uno u otro es la cantidad ycomplejidad de las entidades que vayas a definir, si

Page 26: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 26/36

solo son 4 o 5 entidades se podria definir todo junto,ahora si son 50 bueno seria bueno separararlo

podrias definir un archivo quizas por modulo,agrupando entidades que representen la funcionalidadde compra, la de ventas, etc, asi no se crean tantosarchivos

esto siempre debe estar en la capa de acceso a datos

saludos13 de enero de 2014, 2:30

cquispe dijo...

Leandro muchas gracias por la ayuda...15 de enero de 2014, 14:31

cquispe dijo...

Hola leandro, En un proyecto nuevo que estoyrealizando estoy implementando tu patrón derepositorio genérico. En este ejemplo que muestrasno lo creaste la capa de negocios, más biendirectamente accedes a la capa DAL desde laaplicación cliente.Mi pregunta es:En el proyecto que estoy realizando debería incluir lacapa de negocios desde donde puedo acceder alrepositorio específico que se encuentra en la capa deAcceso a Datos. Ó no es necesario implementar lacapa de negocios?10 de febrero de 2014, 9:32

Leandro Tuttini dijo...

hola cquispe

si estas creando una aplicacion en capas entonces sideberias definir la capa de negocio y acceder desdeesta al repositorio

saludos11 de febrero de 2014, 3:39

cquispe dijo...

Leandro muchas gracias por tu respuesta me sirvió demucho.11 de febrero de 2014, 5:44

cquispe dijo...

Hola Leandro, desde mi capa de negocios como debode especificar los parámetros (condiciones) para losmétodos del repositorio:1. GetAll() que tiene un parametro.

2. Single() que tiene dos parámetros.

Espero contar con su ayuda gracias...

Page 27: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 27/36

11 de febrero de 2014, 22:41

Leandro Tuttini dijo...

hola cquispe

pero puedes no definir el parametro del GetAll() yaque este tiene un sobrecarga, no son obligatoriosel parametro es unexpression del Func<> que definela expression que realiza el include

si revisas los articulos que cree sobre EF vera squeinvoco esta funcionalidad, pero no solo valides estesimle, ve a los que utilizo son relaciones uno amuchosen estos utilizo el include

saludos12 de febrero de 2014, 6:56

Pedro Avila dijo...

Hola Leandro, en que parte del código generas elproyecto para que te genere la DB?13 de abril de 2014, 14:55

Leandro Tuttini dijo...

hola Pedro

alli no planteo ese tema, pero podrias definir lainicializacion

Database Initialization Strategies in CodeFirst

Understanding Database Initializers in EntityFramework Code First

como veras puedes definir como se inicializa la dbsino recuerdo mal por defcto aplica elCreateDatabaseIfNotExists

saludos13 de abril de 2014, 21:46

Juanfish dijo...

Hola Leandro, yo no uso .NET en mi trabajo ni EF. Porlo cual se me vienen a la mente la siguientes dudas:

1) Como haces con clientes cuyas politicas deseguridad no te permiten crear tablas en su base dedatos? probablemente estos clientes no quieranofrecerme un usuario para yo crear y modificar lastablas por codigo y que prefieran que se lesentreguen scripts. Ademas que por otra parte elpersonal de base de datos no se esta enterando de loque estas creando sino despues que ya creas lastablas

2) No es algo delicado tener esta capa de creacion de

Page 28: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 28/36

base de datos en codigo? puede que ocurra unaccidente y alguien haga modificaciones en una tabla.

Saludos28 de mayo de 2014, 13:38

Leandro Tuttini dijo...

hola Juanfish

1 Podrias trabjar la capa d enegocio remota usandoWCF, entonces los clientes no necesitan de ningunusuario para poder acceder a las tablas con EF, sinoque defines uno solo y unico en el sitio web dondeexpones los servicioEl cliente consume los servicio y ni se entera pordetras como se acceden a los datos.

2 Es que si te pones a buscar todo resulta siendodelicado, pero no por eso no lo usassi se supone que trabajas prolijo y realizas pruebas detu codigo no deberias tener ningun problema.Es mas millones de desarrolladores en todo el mundousan EF crees que si fuera "delicado" lo usarian?yo lo he usado con proyectos grandes y va perfecto

saludos29 de mayo de 2014, 4:42

Pedro Avila dijo...

Puedo utilizar el contexto en un modelo de patronSigleton?29 de mayo de 2014, 9:37

Leandro Tuttini dijo...

hola Pedro

no lo aconsejaria a menos que solo mantenga laintencia del contexto por el request o transaccionluego de terminada se destruya

saludos29 de mayo de 2014, 9:42

Pedro Avila dijo...

Si estoy usando Visual Studio 2012 ya no instaloatravez de nuget EF, pero como agrego la referencia?

Pq si la busco por nuget me va instalar la versión 629 de mayo de 2014, 11:00

Leandro Tuttini dijo...

hola Pedro

y porque no puedes usar la version 6 ?

sino deberias buscar la dll en la carpeta "packages" y

Page 29: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 29/36

referenciar desde alli

saludos29 de mayo de 2014, 11:34

Pedro Avila dijo...

LeoEs necesario crear la clase helper?me sale el siguiente errorError de Assert.AreEqual. Se esperaba <13>, pero es<1>. en Prueba.UnitTest.UnitTest1.Get_All_Category() enUnitTest1.cs: line 2729 de mayo de 2014, 19:31

Pedro Avila dijo...

Es necesario poner esto en el test

[TestInitialize]public void inicializar()DbHelper.CreateDb();29 de mayo de 2014, 19:41

Pedro Avila dijo...

Ya veo que era eso, ahora puedo decir excelente post.Viva Argentina!!!29 de mayo de 2014, 19:54

ksoto dijo...

Leandro Buenas Noches, sigo tu blog y estoy muymetido en el cuento de Entity Framework me hagustado mucho, me gustaria que por favor meindicaras como puedo usar

public List GetAll(List>> includes)List includelist = new List();

foreach (var item in includes)MemberExpression body = item.Body asMemberExpression;if (body == null)throw new ArgumentException("The body must be amember expression");

includelist.Add(body.Member.Name);

using (NorthWindContext context = newNorthWindContext())DbQuery query = context.Set();

includelist.ForEach(x => query = query.Include(x));

Page 30: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 30/36

return (List)query.ToList();

para traer solo las columnas que necesito y llenar undatagridview, agradezco todo lo que me hasenseñado.12 de julio de 2014, 16:17

Leandro Tuttini dijo...

hola ksoto

con el GetAll() no puedes definir que columnasrecuperar, solo se indica que entidad quieres tomar

si tienes una entidad compleja quizas puedas usar

[Entity Framework][Code First] Dividir Tabla (TableSplitting)

o sino recuperar toda la entidad y luego cuando esteen memoria hacer un select de linq y tomar soloalgunos campos

var result = from item in entidad.GetAll()select new prop1 = item.prop1,prop2 = item.prop2;

de esta forma decides que campos recuperar

ademas recuerda que en el grid puede indicar quecolumnas mostrar definiendolas en tiempo de diseñoy asignando el DataPropertyName para mapearla conlos datos

saludos14 de julio de 2014, 3:43

Ariel Ganc dijo...

Hola Leandro como estas? muy bueno todo , ya bajeel ejemplo voy a ponerme a trabajar y aprender.consulta como o con que aplicarías Inversion decontrol y/o inyección de dependencias? estuvetrabajando con una versión mvc adoc dondeinyectábamos en los controlers los Dao.. GraciasTotales20 de agosto de 2014, 8:43

Leandro Tuttini dijo...

hola Ariel

las librerias mas difundidas que podrias usar sonUnity, Ninject o StructureMap

Page 31: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 31/36

cualquiera de estas son muy buenas, por supuestoalguna puede que tenga alguna ventaja adicional,segun que necesites lograr

saludos21 de agosto de 2014, 11:46

Ariel Ganc dijo...

Leandro , consulta , estoy tratando de mapear dosclase ejemplo curso alumnos. hay que mapear en el map esta situacion? o se hacesolo con declarar en la clase q tiene una coleccion dealumnos? no logro hacerlo. tenes un ejemplo? graciastotales28 de agosto de 2014, 12:26

Leandro Tuttini dijo...

hola Ariel

si usas las convernsiones que define EF comoestandar no hace falta definir el map, con solo ponerlas entidades en el las propeidad DbSet<> del contextalcanza

ahora si quieres personalizar el mapping definiendoalgun atributo o relacion entonces si debes mapearlo

las relaciones tambien tienen convencionesConvenciones de Code First

si las sigues no debes indicar nada, aunquepersonalmente me gusta declararlas

saludos29 de agosto de 2014, 13:44

Ariel Ganc dijo...

a mi tambien me gusta declararlas ( NHibernate) perono se como hacerlo en EF. y no veo ejemplos. si tenesuno ya arranco gracias29 de agosto de 2014, 15:12

Ariel Ganc dijo...

el problema q cuando quiero acceder a la coleccion deelementos sale una excepcion pq arma un sql concampos q presupone q se llaman asi y no es verdad.necesito mapear la relacion. y no veo ejemplos29 de agosto de 2014, 15:29

Leandro Tuttini dijo...

hola Ariel

para definir el mapping lo haces como los articulosque he escrito sobre el tema, revisaste mis otrosarticulos sobre code first?

Page 32: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 32/36

el mapping se hace desde codigo, no se si usasteFluent de NHibernate, bueno es esa misma tecnica

el mapping lo defines en el OnModelCreating de laclase que hereda de DbContextdefines clases que hereden deEntityTypeConfiguration<> esto lo explico en elarticulo

saludos29 de agosto de 2014, 18:09

Ariel Ganc dijo...

Si e mapeado con fluent , ya logre lo que queria acamuestran como hacerlo.http://stackoverflow.com/questions/19342908/entityframeworkmanytomanymapping.

ahora sale un error de contexto al anvegar sobre lapropiedad mapeada . sale "La instancia deObjectContext se ha eliminado" ...no deja de darmesorpresas..veremos dodne enceuntro como solucionaresto . MUchas gracias Leandro29 de agosto de 2014, 18:18

Leandro Tuttini dijo...

hola Ariel

pero yo ye tengo articulos sobre ese tema[Entity Framework][Code First] Asociación mucho amuchos

por eso te decia si revisaste los otros temas del blog

saludos29 de agosto de 2014, 19:13

Ariel Ganc dijo...

Si Leandro lei todos los articulos ..q estan excelentes. ya que no funciona la carga o navegacion sobre lalista de objetos contenidos dentro de la clase opte porno mapear esa clase y asignarle una lista de objetos amano utilizando el get de la clase contenida. pero noanda quiere crear un campo q no existe. ejemploCuando consulto MenuItem

dame todos los Items de menu Donde IdMenuPadre =id , me dice "El nombre de columna'ParentMenu_IdMenu' no es válido." y si no existe nose pq la quiere crear.. asi estoy trabado. en estoydias voy a tomar un curso presencial ojala puedanevacuar esta duda tan básica. alguien se topo con unproblema asi??? Gracias Totales6 de septiembre de 2014, 12:11

Leandro Tuttini dijo...

hola Ariel

Page 33: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 33/36

pero tu defines esa columna ParentMenu_IdMenu, o laesta creando EF de forma automatica?porque puede ser que el mapping de la relacion noeste definido

esta definiendo el HasMany() con el Map() paraindicar que columnas usas para mapear la relacion ?

no lo dejes solo con las propiedades porque EF va ausar un campos por defecto que quizas no tengasdefinidos

saludos9 de septiembre de 2014, 22:03

Ariel Ganc dijo...

Leandro otra vez yo, consulta mapeo al realacionesen los maps. pero esas colecciones vienen vacias enel get. EF no te puebla las coleccciones IColleccion?aparte del mapeo las tengo que poblar a mano , odeberia poblarlas? si le cargas elementos salva larelacion?? Gracias totales24 de septiembre de 2014, 11:28

Ariel Ganc dijo...

ahora consulto los usuarios y hago varios for para irtrallendo los elementos de una relacion muchos amuchos de a un elemento pq no puebla.ojala se pueda hacer en EF asi no hay que hacerlo amano

public override List GetAll()using (GigaContext context = new GigaContext())List _l = (List)context.Set().ToList();IList _pu = new List();

foreach (Usuario item in _l)_pu = (List)context.Set().Where( x => x.idUsuario== item.Id) .ToList();foreach (PerfilPorUsuario _PerfilPorUsuario in _pu)item.Perfiles.Add(_PerfilPorUsuario.Perfil);return _l;24 de septiembre de 2014, 11:57

Ariel Ganc dijo...

este map da error al consultapq no lo pude descubrir aun

Page 34: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 34/36

CREATE TABLE [dbo].[tUsuarioPerfil]([idUsuarioPerfil] [int] IDENTITY(1,1) NOT FORREPLICATION NOT NULL,[idUsuario] [int] NOT NULL,[idPerfil] [int] NOT NULL,[Version] [int] NOT NULL,

HasMany(Perfil => Perfil.Usuarios).WithMany(Usuario => Usuario.Perfiles).Map(mc =>mc.MapLeftKey("IdPerfil");mc.MapRightKey("idUsuario");mc.ToTable("tUsuarioPerfil"););

en la otra clase al reves si funciona

HasMany(Usuario => Usuario.Perfiles).WithMany(Perfil => Perfil.Usuarios).Map(mc =>mc.MapLeftKey("IdUsuario");mc.MapRightKey("idPerfil");mc.ToTable("tUsuarioPerfil"););24 de septiembre de 2014, 13:31

Leandro Tuttini dijo...

hola Ariel

para cargar las relaciones tienes que usar el Include()

Loading Related Entities

saludos25 de septiembre de 2014, 11:19

Luis dijo...

Hola Leandro, que tal.He estado viendo los artículos que has publicadoacerca de Code First, de mas esta decir que sonexcelentes.Tengo una pregunta:En una solución de VS que contiene varios proyectos,y que define varios contextos diferentes (uno o maspor cada proyecto), requiero aislar la clase base, y aesta pasarle el contexto de acuerdo al proyecto quese este ejecutando. como puedo pasar dicho contextoa la clase base?.Tendrías un ejemplo o alguna referencia donde poderbuscar mas información?SaludosLuis8 de octubre de 2014, 9:59

Leandro Tuttini dijo...

hola Luis

Page 35: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 35/36

Publicar un comentario en la entrada

todos los contextos crean su modelo contra la mismadb, o cada contexto de EF crea su propia base dedatos?

en el repository podrias definir en el constructor quecontexto utilizaralgo como ser

public class BaseRepository<T> : IRepository<T>

private DbContext _context;

public BaseRepository(DbContext context)_context = context;

//resto codigo

de esta forma en la clase base puede cambiar elcontexto segun que entidad lo utilice

si usas IoC la instancia podrias inyectarladinamicamente

saludos8 de octubre de 2014, 12:58

Luis dijo...

Hola Leonardo, gracias por tu respuesta.Si efectivamente la idea es que cada contexto crea sumodelo contra la BD. Voy a probar lo que indicas.Saludos y gracias10 de octubre de 2014, 7:38

Page 36: Crear Entidad Simple

15/10/2015 Leandro Tuttini Blog: [Entity Framework][Code First] Crear entidad simple

file:///C:/Users/greg/Desktop/layered/Leandro%20Tuttini%20Blog%20%20%5BEntity%20Framework%5D%5BCode%20First%5D%20Crear%20entida… 36/36

Entrada más reciente Entrada antiguaPágina principal

Suscribirse a: Enviar comentarios (Atom)