2016-07-26 10 views
1

zu verwenden Ich verwende Entity Framework Core zusammen mit Repository-Muster und ich habe ein Problem.Ausnahme beim Versuch, `ThenInclude` in EF Core

Ich habe Klassen Customer, Company und Email denen versteckte Dinge hier nicht relevant, die aussehen wie folgt:

public class Email 
{ 
    public int EmailId { get; protected set; } 

    public string Address { get; protected set; } 

    public string Description { get; protected set; } 

    public Email(string address, string description) 
    { 
     if (string.isNullOrEmpty(address)) 
      throw new ArgumentException(nameof(address)); 

     if (string.isNullOrEmpty(description)) 
      throw new ArgumentException(nameof(description)); 

     this.Address = address; 
     this.Description = description; 
    } 

    protected Email() { } 
} 

public class Company 
{ 
    public int CompanyId { get; protected set; } 

    public IList<Email> Emails { get; set; } 
} 

public class Customer 
{ 
    public int CustomerId { get; protected set; } 

    public Company Company { get; set; } 
} 

Die Zuordnungen sind so eingestellt, dass es einen Zusammenhang zwischen Customer Eins-zu-eins und Company, während es eine Eins-zu-Viele-Assoziation zwischen Company und Email gibt.

Auf der CustomersRepository Ich habe dann die folgende Methode:

public IEnumerable<Customer> GetAll() 
{ 
    return _context.Set<Customer>() 
        .Include(x => x.Company) 
         .ThenInclude(x => x.Emails) 
        as IEnumerable<Customer>; 
} 

Nun ThenInclude Stück ein Problem gibt. Wenn ich versuche, diese Methode zu verwenden, bekomme ich eine Ausnahme, die besagt, dass source null ist.

Ich habe alles überprüft, aber ich habe nichts falsch gefunden. Es scheint alles korrekt geschrieben zu sein.

Der springende Punkt ist: Ich habe Entitäten A, B, C so dass A eine B hat, und B viele C hat, und wenn ich A abrufen Ich brauche alles verbunden zu bekommen.

Was mache ich hier falsch? Warum bekomme ich diese Ausnahme?

+1

Können Sie nicht einfach '.Include (x => x.Company.Emails)'? – Will

+0

Danke @Will, es funktioniert mit dieser Lösung! Wissen Sie übrigens, warum das 'ThenInclude' nicht funktioniert? Wenn ich die Dokumente verstanden habe, ist das der empfohlene Weg, aber in diesem Fall funktioniert es einfach nicht. – user1620696

+0

Sorry, keine Ahnung. Nie benutzt ThenInclue, weiß nicht, wie es implementiert ist. Lass mich für eine Sekunde hineinschauen und füge eine Antwort hinzu. – Will

Antwort

3

https://github.com/aspnet/EntityFramework/issues/2274

Es wurde als IOE berichtet, dann fixiert berichtet, dann als NRE es kam zurück, wie Ihre Ausnahme Dies scheint auf Github zu diesem Bug-Report zusammen. Das Problem besagt, dass es wieder behoben wurde, aber ich bin mir nicht sicher, in welcher Version und welche Version Sie gerade verwenden.

(Gesucht nach ThenInclude Probleme in der Github repro - es gibt eine TON.)

Sounds instabil. Bleib weg davon. Sie können das Problem einfach vollständig vermeiden, indem Sie den vollständigen Pfad Ihres Includes direkt eingeben

muhCompaniesOrWhatevs.Include(x => x.Company.Emails);