Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to query many-to-many releationship in EF Core

Tags:

I'm using .NET Core and EF Core for a web project. I'm struggling how to query a many-to-many releationship. This is what my models look like:

public class Begrip {     public int ID { get; set; }     public string Name { get; set; }      public string Desc { get; set; }     [Url]     public string URL { get; set; }      public ICollection<BegripCategory> Categories { get; set; }  }  public class Category {     public int ID { get; set; }     public string Name { get; set; }      public ICollection<BegripCategory> Begrippen { get; set; } }  public class BegripCategory {     public int begripId { get; set; }     public Begrip begrip { get; set; }      public int categoryId { get; set; }     public Category category { get; set; }  } 

And my Database context:

public class PBBContext : DbContext {     public PBBContext (DbContextOptions<PBBContext> options)         : base(options)     {     }      public DbSet<PBB.Models.Movie> Movie { get; set; }     public DbSet<PBB.Models.Begrip> Begrip { get; set; }      public DbSet<PBB.Models.Category> Category { get; set; }      public DbSet<PBB.Models.BegripCategory> BegripCategory { get; set; }      protected override void OnModelCreating(ModelBuilder modelbuilder)     {         modelbuilder.Entity<BegripCategory>().HasKey(bc => new { bc.begripId, bc.categoryId });          modelbuilder.Entity<BegripCategory>().HasOne(b => b.begrip).WithMany(bg => bg.Categories).HasForeignKey(bc => bc.begripId);         modelbuilder.Entity<BegripCategory>().HasOne(c => c.category).WithMany(ca => ca.Begrippen).HasForeignKey(cc => cc.categoryId);     } } 

What im trying to do is to return all the "Begrippen" in a JSON result with all the corresponding "Categories", however, I can't figure out how to get the list of "Categories" for them.

Any ideas? Thanks in advance.

like image 758
JessengBijleng Avatar asked Jun 12 '17 12:06

JessengBijleng


People also ask

When would you use EF6 vs EF core?

Keep using EF6 if the data access code is stable and not likely to evolve or need new features. Port to EF Core if the data access code is evolving or if the app needs new features only available in EF Core. Porting to EF Core is also often done for performance.

What is IEntityTypeConfiguration?

IEntityTypeConfiguration<TEntity> InterfaceAllows configuration for an entity type to be factored into a separate class, rather than in-line in OnModelCreating(ModelBuilder).


1 Answers

EF Core won't load related properties automatically, so you'll need to explicitly do this, but something like the following should do the trick:

var result = context.Begrip     .Include(x => x.Categories)     .ThenInclude(x => x.category); 

Note, intellisense doesn't always work on .ThenInclude at the moment, but the code should still compile even if it gets a red underline.

If you're returning this to the view or an API, you'll likely want to map it to a DTO so you don't have to deal with .Categories[0].category.Name etc.

like image 60
Richard Avatar answered Sep 19 '22 17:09

Richard