miércoles, 19 de febrero de 2014

[EntityFramework] Configurar una relación uno a uno en Code First

En artículos anteriores, vimos cómo configurar nuestras entidades de dominio a través de Data Annotations y a través de Fluent Api, ahora vamos a ver cómo configurar diferentes relaciones en la base de datos mediante estas dos alternativas, en primera instancia vamos a ver cómo configurar una relación de uno a uno entre las entidades Producto y Categoria.

Relación de uno a uno mediante Data Annotations:

Nuestra entidad Categoria será de la siguiente forma:

    public class Categoria
    {
        public int Id { getset; }
 
        [MaxLength(100)]
        public string Nombre { getset; }
 
        [MaxLength(200)]
        public string Descripcion { getset; }
 
        [Required]
        public virtual Producto Producto { getset; }
    }

Entonces para nuestro ejemplo supondremos que un producto solo puede tener una categoría, y para configurar la relación a través de Data Annotations hacemos lo siguiente:

    [Table("Productos")]
    public class Producto
    {
        [Key]
        public int Codigo { getset; }
 
        [Required]
        [Column("Nombre", TypeName = "varchar", Order = 2)]
        public string Nombre { getset; }
 
        [MaxLength(100), MinLength(10)]
        public string Descripcion { getset; }
 
        [NotMapped]
        public string CodigoIso { getset; }
 
        [ForeignKey("Categoria")]
        public int IdCategoria { getset; }
 
        public virtual Categoria Categoria { getset; }
    }

Como podemos ver en nuestra entidad Producto creamos una propiedad de tipo entero llamada IdCategoria, y la decoramos con el atributo ForeignKey el cual nos indica que esta propiedad nos servirá para relacionarla con otra entidad, y vemos que en su constructor especificamos la palabra "Categoria", que hace alusión a la propiedad virtual que nos sirve para configurar la relación con la entidad Categoria, de esta forma una vez se cree la base de datos se creara la relación de uno a uno.

Para probar esto podemos crear una aplicación de consola y escribir 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 };
            using (var contexto = new Context())
            {
                contexto.Productos.Add(producto);
                contexto.SaveChanges();
            }
        }
    }

Y observaremos que tan sólo agregando el producto a la base de datos también se agregara la categoría correspondiente en su respectiva tabla y con sus relaciones correspondientes. Ahora vamos a ver como lo podemos hacer pero esta vez usando Fluent Api.

Relación de uno a uno mediante Fluent Api:

Para configurar la relación a través de Fluent Api, creamos una clase de configuración para la entidad Categoria o lo hacemos directamente en el contexto como vimos en el artículo Configurando nuestras entidades de dominio con Fluent Api:

    public class CategoriaMappings : EntityTypeConfiguration<Categoria>
    {
        public CategoriaMappings()
        {
            // Crear relación con la entidad Producto.
            this.HasRequired(c => c.Producto).WithRequiredPrincipal(e => e.Categoria);
        }
    }

Como vemos homologamos el código planteado anteriormente con Data Annotations, indicando que en la entidad categoría se requiere un producto y de igual forma en la entidad productos se requiere una 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 uno en Entity Framework code First, en próximos artículos observaremos cómo configurar otros tipos de relaciones.

Saludos y buena suerte!


4 comentarios:

  1. Gracias amigo buen aporte, tenia un problema con dos entidades, relacion de uno a uno, hize lo que explicas y me funciono.

    ResponderEliminar
    Respuestas
    1. Hola Oswaldo, que bueno que te resultó útil la explicación. saludos!

      Eliminar
  2. Respuestas
    1. Hola Reghis, que bueno que te resultó útil la explicación. saludos!

      Eliminar