tutorial paginacion net mvc migrations framework first example español enable code asp asp.net-mvc entity-framework ef-code-first foreign-keys foreign-key-relationship

asp.net-mvc - paginacion - mvc model example



Definición de múltiples claves externas para la misma tabla en Entity Framework Code First (2)

Para lograr lo que desea, debe proporcionar alguna configuración adicional. El código de la primera convención puede identificar las relaciones bidireccionales, pero no cuando hay múltiples relaciones bidireccionales entre dos entidades. Puede agregar la configuración (usando Anotaciones de datos o la API Fluent ) para presentar esta información al constructor de modelos. Con las anotaciones de datos, usará una anotación llamada InverseProperty . Con la API Fluent, usará una combinación de los métodos Has / With para especificar los extremos correctos de estas relaciones.

El uso de anotaciones de datos podría ser así:

public class Student { public int ID { get; set; } public string Name { get; set; } public string Surname { get; set; } public int BirthCityID { get; set; } public int LivingCityID { get; set; } [ForeignKey("BirthCityID")] [InverseProperty("Students")] public virtual City BirthCity { get; set; } [ForeignKey("LivingCityID")] public virtual City LivingCity { get; set; } }

De esta forma, especifica explícitamente que desea relacionar la propiedad de navegación de BirthCity con la propiedad de navegación de Students en el otro extremo de la relación.

Usar Fluent Api podría ser así:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Student>().HasRequired(m => m.BirthCity) .WithMany(m => m.Students).HasForeignKey(m=>m.BirthCityId); modelBuilder.Entity<Student>().HasRequired(m => m.LivingCity) .WithMany().HasForeignKey(m=>m.LivingCityId); }

Con esta última solución no necesita usar ningún atributo.

Ahora, la sugerencia de @ChristPratt de tener una colección de Student en su clase de City para cada relación es realmente útil. Si hace eso, las configuraciones que usan Anotaciones de datos podrían ser de esta manera:

public class Student { public int ID { get; set; } public string Name { get; set; } public string Surname { get; set; } public int BirthCityID { get; set; } public int LivingCityID { get; set; } [ForeignKey("BirthCityID")] [InverseProperty("BirthCityStudents")] public virtual City BirthCity { get; set; } [ForeignKey("LivingCityID")] [InverseProperty("LivingCityStudents")] public virtual City LivingCity { get; set; } }

O usando Fluent Api siguiendo la misma idea:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Student>().HasRequired(m => m.BirthCity) .WithMany(m => m.BirthCityStudents).HasForeignKey(m=>m.BirthCityId); modelBuilder.Entity<Student>().HasRequired(m => m.LivingCity) .WithMany(m => m.LivingCityStudents).HasForeignKey(m=>m.LivingCityId); }

Tengo dos entidades en mi aplicación MVC y llené la base de datos con el enfoque Entity Framework 6 Code First. Hay dos ID de ciudad en la entidad Estudiante; uno de ellos para BirthCity, el otro para WorkingCity. Cuando defino las claves foráneas como arriba, se crea una columna adicional llamada City_ID en la tabla Estudiante después de la migración. ¿Hubo un error o cómo definir estos FK? Gracias por adelantado.

Estudiante:

public class Student { public int ID { get; set; } public string Name { get; set; } public string Surname { get; set; } public int BirthCityID { get; set; } public int LivingCityID { get; set; } [ForeignKey("BirthCityID")] public virtual City BirthCity { get; set; } [ForeignKey("LivingCityID")] public virtual City LivingCity { get; set; } }


Ciudad:

public class City { public int ID { get; set; } public string CityName { get; set; } public virtual ICollection<Student> Students { get; set; } }


Sheesh Ha sido un largo día. En realidad, hay un problema muy grande y deslumbrante con su código, que de hecho me perdí por completo cuando comenté.

El problema es que estás usando una sola colección de estudiantes en City . Lo que realmente sucede aquí es que EF no puede decidir a qué clave externa debe asignar esa colección, por lo que crea otra clave externa específicamente para rastrear esa relación. Entonces, en efecto, no tiene propiedades de navegación para las colecciones de estudiantes derivadas de BirthCity y LivingCity .

Para esto, debe desplegarse a una configuración fluida, ya que no hay forma de configurar esto correctamente utilizando solo anotaciones de datos. También necesitará una colección adicional de estudiantes para poder rastrear ambas relaciones:

public class City { ... public virtual ICollection<Student> BirthCityStudents { get; set; } public virtual ICollection<Student> LivingCityStudents { get; set; } }

Entonces, para el Student :

public class Student { ... public class StudentMapping : EntityTypeConfiguration<Student> { public StudentMapping() { HasRequired(m => m.BirthCity).WithMany(m => m.BirthCityStudents); HasRequired(m => m.LivingCity).WithMany(m => m.LivingCityStudents); } } }

Y finalmente en tu contexto:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new Student.StudentMapping()); }