Entity Framework Viele, zu Viele Werke Beinhalten aber nicht
Habe ich ein typisches " viele-zu-viele-Beziehung mit diesen 3 Tabellen
[Post] (
[PostId] int, (PK)
[Content] nvarchar(max)
...
)
[Tag] (
[TagId] int, (PK)
[Name] nvarchar
...
)
[TagPost] (
[TagId] int, (PK, FK)
[PostId] int (PK, FK)
)
Und TagId und PostId, sind die PK-und FK-Satz auf die Tische entsprechend, etc. Dann habe ich diese Klassen und mapping in c#
public class Post {
public Post()
{
this.Tags = new HashSet<Tag>();
}
[Key]
public int PostId { get; set; }
...
public virtual ICollection<Tag> Tags { get; private set; }
}
public class Tag {
public Tag()
{
this.Posts = new HashSet<Post>();
}
[Key]
public int TagId { get; set; }
...
public virtual ICollection<Post> Posts { get; private set; }
}
internal class MyDbContext : DbContext
{
public DbSet<Post> Posts { get; set; }
public DbSet<Tag> Tags { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Post>().ToTable("Post");
modelBuilder.Entity<Tag>().ToTable("Tag");
modelBuilder.Entity<Post>()
.HasMany(x => x.Tags)
.WithMany(x => x.Posts)
.Map(x =>
{
x.ToTable("TagPost");
x.MapLeftKey("PostId");
x.MapRightKey("TagId");
});
}
Dann habe ich das code-Abfrage, Sie
var list = (from p in ctx.Posts.Include(p => p.Tags)
from t in p.Tags
where ... //some of my filter conditions
select p).ToList();
Diese Verknüpfung wird zurückkehren, die Beiträge, die ich suchte, aber die zurückgegebenen Beiträge nicht den entsprechenden tags ausgefüllt, obwohl ich die Enthalten es. Könnte mir jemand helfen auf was mir fehlt, damit ich die tags auch wieder mit den posts?
Vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Doppelzimmer
from
ist eine manuelleJoin
wodurch dieInclude
ignoriert werden, wie bereits erwähnt hier und hier.Include
wird auch ignoriert, für weitere LINQ-Methoden wie Gruppierung und Projektionen.Beziehung-Korrektur im Allgemeinen nicht für viele-zu-viele-Beziehungen, nur für Beziehungen, die mindestens eine einzige Referenz an einem der enden - eins-zu-viele-oder eins-zu-eins. Wenn Ihr Projekt die
Posts
und VerwandteTags
in einen anderen Typ (anonym oder benannt) werden die Daten korrekt geladen, aber weil die Beziehung viele-zu-viele-EF nicht erstellen Sie die Beziehung im Speicher automatisch, so dass diepost.Tags
Sammlung wird leer bleiben.Um die
Include
arbeiten, müssen Sie entfernen Sie die zweitefrom
aus der Abfrage und Anwendung derwhere
- Klausel direkt an diePost
entity-parameter, zum Beispiel so:Den filter, indem Sie eine
Tag
Eigenschaft wird angegeben, der Ausdruck ging in.Any
was ist ein Ausdruck mit einemTag
(t
) als parameter.versuchen Sie, alles in ein anonymes Objekt (sowas in der Art)
Basierend auf dem feedback zu meiner ersten Antwort und der Tatsache, dass EF finden die zugehörigen Entitäten, aber es nicht zum Auffüllen der
Tags
Sammlung ich glaube, das Problem liegt in der definition der entity-Tags in der Post-Klasse.Versuchen, das entfernen des
Hashset<>
initialiser aus der Konstruktoren undprivate
von der Satz-Erklärung:Tag
Referenzen in den einzelnenPost
.Tags
Eigenschaft des anonymen Typs gefüllt?