Ich verwende .NET Core und EF Core für ein Webprojekt. Ich habe Probleme damit, eine Viele-zu-Viele-Beziehung anzufragen. So sehen meine Models aus:
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; }
}
Und mein Datenbankkontext:
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);
}
}
Was ich versuche, ist, alle "Begrippen" in einem JSON-Ergebnis mit allen entsprechenden "Kategorien" zurückzugeben, aber ich kann nicht herausfinden, wie man die Liste von "Kategorien" für sie bekommt.
Irgendwelche Ideen? Danke im Voraus.
EF Core lädt verwandte Eigenschaften nicht automatisch. Sie müssen dies also explizit tun, aber etwas wie das Folgende sollte den Trick machen:
var result = context.Begrip
.Include(x => x.Categories)
.ThenInclude(x => x.category);
Beachten Sie, dass Intellisense nicht immer an .ThenInclude
im Moment .ThenInclude
, aber der Code sollte trotzdem kompilieren, auch wenn es eine rote Unterstreichung bekommt.
Wenn Sie dies an die Ansicht oder an eine API zurückgeben, möchten Sie sie wahrscheinlich einem DTO .Categories[0].category.Name
damit Sie sich nicht mit .Categories[0].category.Name
usw. befassen .Categories[0].category.Name
.
Wenn Sie eine Many-to-Many-Beziehung unten beschreiben möchten, empfehle ich, eine LinQ Enumerable Any-Methode wie diese zu verwenden:
return result.Where(x => x.Categories.Any(c => c.category == categoryId));
Um eine gefilterte Liste von Entitäten zurückzugeben, die zu einer bestimmten Kategorie gehören.