Entity Framework - Relaciones

En las bases de datos relacionales, la relación es una situación que existe entre tablas de bases de datos relacionales a través de claves externas. Una clave externa (FK) es una columna o combinación de columnas que se utiliza para establecer y hacer cumplir un vínculo entre los datos en dos tablas. El siguiente diagrama contiene tres tablas.

  • Student
  • Course
  • Enrollment

En el diagrama anterior, puede ver algún tipo de asociación / relación entre tablas. Hay tres tipos de relaciones entre tablas y la relación entre diferentes tablas depende de cómo se definan las columnas relacionadas.

  • Relación uno a muchos
  • Relación de muchos a muchos
  • Relación uno a uno

Relación uno a muchos

  • Una relación de uno a varios es el tipo de relación más común.

  • En este tipo de relación, una fila de la tabla A puede tener muchas filas coincidentes en la tabla B, pero una fila de la tabla B solo puede tener una fila coincidente en la tabla A.

  • La clave externa se define en la tabla que representa los muchos extremos de la relación.

  • Por ejemplo, en el diagrama anterior, las tablas de estudiantes y matrículas tienen una relación de uno a muchos, cada estudiante puede tener muchas matrículas, pero cada matrícula pertenece a un solo estudiante.

En el marco de la entidad, estas relaciones también se pueden crear con código. A continuación se muestra un ejemplo de las clases de estudiantes y de inscripción que están asociadas con una relación de uno a muchos.

public class Student {
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public DateTime EnrollmentDate { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

public class Enrollment {

   public int EnrollmentID { get; set; }
   public int CourseID { get; set; }
   public int StudentID { get; set; }
	
   public Grade? Grade { get; set; }
   public virtual Course Course { get; set; }
   public virtual Student Student { get; set; }
}

En el código anterior, puede ver que la clase de estudiante contiene la colección de inscripción, pero la clase de inscripción tiene un solo objeto de estudiante.

Relación de muchos a muchos

En la relación de varios a varios, una fila de la tabla A puede tener muchas filas coincidentes en la tabla B y viceversa.

  • Puede crear una relación de este tipo definiendo una tercera tabla, llamada tabla de unión, cuya clave principal consta de las claves externas de la tabla A y la tabla B.

  • Por ejemplo, las tablas Student y Course tienen una relación de varios a varios que se define mediante una relación de uno a varios de cada una de estas tablas a la tabla de inscripción.

El siguiente código contiene la clase Course y las dos clases anteriores, es decir, Student y Enrollment.

public class Course {
   [DatabaseGenerated(DatabaseGeneratedOption.None)]
	
   public int CourseID { get; set; }
   public string Title { get; set; }
	
   public int Credits { get; set; } 
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

Puede ver que tanto la clase del curso como la clase del estudiante tienen colecciones de objetos de inscripción, lo que establece una relación de muchos a muchos a través de la inscripción de la clase de unión.

Relación uno a uno

  • En una relación uno a uno, una fila de la tabla A no puede tener más de una fila coincidente en la tabla B, y viceversa.

  • Se crea una relación uno a uno si ambas columnas relacionadas son claves primarias o tienen restricciones únicas.

  • En una relación uno a uno, la clave principal actúa además como clave externa y no hay una columna de clave externa separada para ninguna de las tablas.

Este tipo de relación no es común porque la mayor parte de la información relacionada de esta manera estaría toda en una tabla. Puede utilizar una relación uno a uno para:

  • Divida una tabla con muchas columnas.
  • Aísle parte de una tabla por razones de seguridad.
  • Almacene datos de corta duración y que podrían eliminarse fácilmente simplemente eliminando la tabla.
  • Almacene información que se aplique solo a un subconjunto de la tabla principal.

El siguiente código es para agregar otro nombre de clase StudentProfile que contiene la identificación de correo electrónico y la contraseña del estudiante.

public class Student {
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public DateTime EnrollmentDate { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
   public virtual StudentProfile StudentProfile { get; set; }
}

public class StudentProfile {

   public StudentProfile() {}
   public int ID { get; set; }
   public string Email { get; set; }
   public string Password { get; set; }
	
   public virtual Student Student { get; set; }
}

Puede ver que la clase de entidad Student contiene la propiedad de navegación StudentProfile y StudentProfile contiene la propiedad de navegación Student.

Cada estudiante tiene solo un correo electrónico y una contraseña para iniciar sesión en el dominio de la universidad. Esta información se puede agregar a la tabla de Estudiantes pero, por razones de seguridad, se separa en otra tabla.