crear entidad simple
TRANSCRIPT
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
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
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>
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);
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 =
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
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();
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);
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);
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);
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");
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
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);
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);
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...
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
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
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
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...
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()
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
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
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
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
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
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...
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
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
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));
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
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?
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
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
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
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
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)