Relación de uno a muchos mediante Data Annotations:
Nuestra entidad Producto será de la siguiente forma:
[Table("Productos")] public class Producto { [Key] public int Codigo { get; set; } [Required] [Column("Nombre", TypeName = "varchar", Order = 2)] public string Nombre { get; set; } [MaxLength(100), MinLength(10)] public string Descripcion { get; set; } [NotMapped] public string CodigoIso { get; set; } [ForeignKey("Categoria")] public int IdCategoria { get; set; } public virtual Categoria Categoria { get; set; } }
Cómo ven agregamos IdCategoria y especificamos que se trata de la clave foránea con respecto a la entidad categoria, de igual forma agregamos la propiedad Categoria de tipo Categoria que representa la relación, y a continuación en nuestra entidad Categoria agregaremos una colección de tipo Producto para indicar que una categoría puede tener uno o muchos productos:
public class Categoria { [Key] public int Id { get; set; } [MaxLength(100)] public string Nombre { get; set; } [MaxLength(200)] public string Descripcion { get; set; } [Required] public virtual ICollection<Producto> Producto { get; set; } }
Y con esto tenemos configurada nuestra relación de una a muchos entre Productos y Categorías a través de Data Annotations, ahora para probar la configuración podemos crear una app de consola y copiar el siguiente código en la clase program:
class Program { static void Main(string[] args) { var categoria = new Categoria { Id = 1, Nombre = "Lacteos", Descripcion = "Productos lacteos" }; var producto = new Producto { Codigo = 1, Nombre = "Leche", Descripcion = "Producto Lacteo", Categoria = categoria }; var producto2 = new Producto { Codigo = 2, Nombre = "Queso", Descripcion = "Producto Lacteo", Categoria = categoria }; using (var contexto = new Context()) { contexto.Productos.Add(producto); contexto.Productos.Add(producto2); contexto.SaveChanges(); } } }
Relación de uno a muchos mediante Fluent Api:
Ahora vamos a configurar la relación de uno a muchos entre Productos y Categorías, pero esta vez vamos a usar Fluent Api para lograrlo:
public class Context : DbContext { public Context() : base("Productos") { } public DbSet<Producto> Productos { get; set; } public DbSet<Categoria> Categorias { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Aquí haremos nuestras configuraciones con Fluent API. modelBuilder.Configurations.Add(new ProductoMappings()); modelBuilder.Entity<Producto>() .HasRequired<Categoria>(c => c.Categoria) .WithMany(c => c.Productos) .HasForeignKey(c => c.IdCategoria); base.OnModelCreating(modelBuilder); } }
Cómo vemos en el método OnModelCreating especificamos la relación a través de Fluent Api, dónde indicamos la relación partiendo la entidad Producto e indicamos el WithMany con Categoría.
Y bueno amigos, eso es todo, espero les sea de utilidad y de interés este post acerca de relación uno a muchos en Entity Framework code First, en el próximo artículo observaremos cómo configurar una relación de muchos a muchos, para terminar con el tema de relaciones y seguir con otros temas.
Saludos y buena suerte!
Hola... una consulta como harias para recuperar las categorias de un producto??? y la categorias que no estan asociadas a un producto??
ResponderEliminarHola amigo, para recuperar todas las categorías asociadas a un producto, puedes usar Producto.Include("Categorias"), como explico en este artículo: http://www.eltavo.net/2014/04/entityframework-interactuando-con.html
Eliminary para recuperar todas aquellas categorias que no estén asociadas a un producto podrías hacer un query de los productos con include, y en el where especificas que solo te traiga las que su propiedad categorias.Count sea mayor a 0.
saludos!
* sea igual a cero, perdón!
EliminarMuy bien me funciono... Gracias
ResponderEliminarHola Reghis, que bueno que te resultó útil la explicación, gracias por comentar, saludos!
EliminarY como seria una relacion de uno a (cero o uno)
ResponderEliminar