Para crear relaciones entre tablas y por normalización de base de datos cada tabla debe tener una clave primaria que la identifique únicamente, como vimos en el ejemplo anterior nuestras entidades tienen un campo llamado Id, y es por esto que cuando se generó la tabla en la DB se creó este campo como primary key, y es a esto cuando me refería a convención sobre la configuración, en este caso por ejemplo EF busca en la entidad un campo que se llame Id o que contenga esta palabra y a través de esta convención sabe que este campo será la clave primaria de la tabla, y por eso decía anteriormente también que si no se cumplían con las convenciones se debería usar Data Annotations o Fluent API para el configurar, por ejemplo si en mi siguiente entidad mi clave primaria será el campo Codigo que cómo vemos no contiene la palabra Id debemos usar el atributo [Key] para especificarla explícitamente:
[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; } }
Cómo podemos ver decoramos la propiedad Codigo con el atributo [Key] con esto le estamos diciendo a Entity Framework que esta será la clave primaria de la tabla, y podemos ver una serie de atributos que hemos usado y que explicare a continuación:
[Table("Productos")] : Permite asignar un nombre en específico a la tabla que se generará a partir de la entidad, recordemos que si no se usa este atributo Entity Framework asume que el nombre de la tabla será el plural del nombre de la entidad por ejemplo para la entidad Producto su tabla correspondiente recibirá el nombre de Productos.
[Required] : Permite indicar si un campo es requerido o no, es decir si el campo en la tabla permitirá valores nulo o no, lo que conocemos como Null o Not Null.
[Column] : Se usa para indicar información correspondiente a una columna de la tabla, su constructor posee dos sobre cargas en las cuales podemos especificar nombre de la columna en caso de que queramos especificar un nombre diferente al de la propiedad de la entidad, tipo de la columna y orden en el que aparecerá en la tabla.
[MaxLength] : especifica la longitud máxima del campo en la base de datos.
[MinLength] : especifica la longitud mínima del campo en la base de datos.
[NotMapped] : Puede darse el caso que por algún motivo no deseemos mapear alguna propiedad de alguna entidad de dominio a nuestra base de datos ya que solo la queremos tener en nuestra entidad para usarla en nuestra lógica y no queramos persistir la propiedad a la base de datos. Este atributo nos ayuda con esto, cuando EF encuentre alguna propiedad decorada con este atributo simplemente la omitirá y no la tendrá en cuenta para la creación de la DB.
Bueno y con esto damos por terminado nuestro artículo de como configurar nuestras entidades de dominio a través de Data Annotations. Cómo mencione antes existe otra forma de hacer la configuración y es a través de Fluent Api, tema que trataremos en el próximo artículo de esta serie de Entity Framework Code First, espero les sea de interés y utilidad.
Para observar todos los Data Annotatiosn disponibles revisar la documentación del name space System.ComponentModel.DataAnnotations
Saludos y buena suerte!