varios una tabla relacion muchos llenar intermedia framework ejemplos como c# entity-framework ef-code-first many-to-many

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.