c# - una - Mapeo de muchas a muchas relaciones en el código del marco de la entidad primero
relacion uno a muchos entity framework (2)
Intento hacer una prueba en EF, creando una relación de muchos a muchos, porque siempre mapeo Uno a Uno o Uno a Muchos, tengo un ejemplo en Internet para intentarlo, el ejemplo funciona para los registros de inserción, pero no puede leer registros
Aquí están mis clases, no sé qué es HashSet
, obtengo este código en el sitio
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Course> CoursesAttending { get; set; }
public Person()
{
CoursesAttending = new HashSet<Course>();
}
}
public class Course
{
public int CourseId { get; set; }
public string Title { get; set; }
public ICollection<Person> Students { get; set; }
public Course()
{
Students = new HashSet<Person>();
}
}
Aquí está mi contexto
public class SchoolContext : DbContext
{
public DbSet<Course> Courses { get; set; }
public DbSet<Person> People { get; set; }
public SchoolContext()
: base("MyDb")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Course>().
HasMany(c => c.Students).
WithMany(p => p.CoursesAttending).
Map(
m =>
{
m.MapLeftKey("CourseId");
m.MapRightKey("PersonId");
m.ToTable("PersonCourses");
});
}
}
Cuando inserto registros es correcto
static void Main(string[] args)
{
using (SchoolContext db = new SchoolContext())
{
Course math = new Course();
Course history = new Course();
Course biology = new Course();
math.Title = "Math";
history.Title = "History";
biology.Title = "Biology";
db.Courses.Add(math);
db.Courses.Add(history);
db.Courses.Add(biology);
Person john = new Person();
john.FirstName = "John";
john.LastName = "Paul";
john.CoursesAttending.Add(history);
john.CoursesAttending.Add(biology);
db.People.Add(john);
db.SaveChanges();
}
}
Pero cuando intento seleccionar el registro para mostrar contenido, no funciona, simplemente no imprime nada
static void Main(string[] args)
{
using (SchoolContext db = new SchoolContext())
{
Pearson p = db.Peasons.First();
Console.WriteLine(p.CoursesAttending.First().Title);
}
}
He comprobado en la base de datos, existen registros, ¿cuál es el problema?
Por favor, enséñame a hacer una selección de la relación de muchos a muchos con código primero.
Elimine el constructor de su clase y ese método OnModelCreating. EF maneja la relación Muchos a Muchos. No necesitas hacer nada extra.
En primer lugar, es posible que desee habilitar la carga diferida haciendo que las colecciones sean virtuales :
public virtual ICollection<Course> CoursesAttending { get; set; }
public virtual ICollection<Person> Students { get; set; }
Esto permite a EF crear clases derivadas ( proxies ) de Course
y Person
que anulan las colecciones con lógica para cargar sus datos desde el almacén de datos.
Cuando hagas eso verás eso
Console.WriteLine(p.CoursesAttending.First().Title);
ejecutará una consulta separada para llenar los CoursesAttending
.
Alternativamente, o adicionalmente, puede decidir evitar viajes de ida y vuelta a la base de datos con una carga impaciente como:
Person p = db.Persons.Include(p => p.CoursesAttending).First();
Que carga la Person
y los CoursesAttending
de CoursesAttending
en una sola toma.