2017-06-29 4 views
0

Ich habe ein Problem beim Laden einer Entity Framework-Auflistungseigenschaft.Collection-Eigenschaft wird nicht vom übergeordneten Objekt geladen, aber geladen, wenn separat abgefragt wird

Wenn ich versuche, die Sammlung über das übergeordnete Objekt zu laden, bleibt die Sammlungseigenschaft null. Wenn Sie die untergeordnete Auflistungseigenschaft jedoch direkt in einer Abfrage auswählen, werden die richtigen untergeordneten Objekte zurückgegeben.

Hier ist mein Code:

var odr = Db.Orders 
       .Include(o => o.Items) 
       .Where(x => x.ID == orderID) 
       .FirstOrDefault(); 

var manualItems = Db.Orders 
         .Where(x => x.ID == orderID) 
         .Select(x => x.Items) 
         .ToList(); 

Wenn dies ausgeführt wird, odr.Items null ist, aber manualItems hat die richtigen Werte!

Noch bizarrer: setze ich einen Haltepunkt auf einige der Eigenschaft Setter der OrderItem Klasse (die Art der odr.Items und manualItems) - und stellte fest, dass Entity Framework war richtig Abrufen, Erstellen und bevölkern das Kind OrderItem Objekte . Es wurde nur die odr.Items Eigenschaft nicht festgelegt.

Hier ist die Klasse und Zuordnungen, als Referenz:

Bestellen

public class Order 
{ 
    public string ID { get; set; } 

    <snip> 

    public virtual ICollection<OrderItem> Items { get; set; } 
} 

Artikel bestellen

public class OrderItem : IOrderItem 
{ 
    public int ID { get; set; } 
    public string OrderID { get; set; } //I set a breakpoint on the setter here, it was called each time 

    public string ProductSku { get; set; } 
    public string ProductName { get; set; } 
} 

Bestellen Mapping

public class OrderMap : EntityTypeConfiguration<Order> 
{ 
    public OrderMap() : base() 
    { 
     HasKey(m => m.ID); 
     Property(m => m.ID).HasColumnName("id").HasMaxLength(50); 

     <snip> 

     HasMany(m => m.Items).WithOptional().HasForeignKey(x => x.OrderID); 

     ToTable("order_details"); 
    } 
} 

Artikel bestellen Mapping

public class OrderItemMap : EntityTypeConfiguration<OrderItem> 
{ 
    public OrderItemMap() : base() 
    { 
     HasKey(m => m.ID); 
     Property(m => m.ID).HasColumnName("id"); 
     Property(m => m.OrderID).HasColumnName("order_id"); 
     Property(m => m.ProductSku).HasColumnName("product_sku"); 
     Property(m => m.ProductName).HasColumnName("product_name"); 
     ToTable("order_items"); 
    } 
} 

ich das ID-Feld auf die in der Tatsache, .NET 4.6 und Entity Framework 6.1.3

+0

Gegen welche Datenbank arbeiten Sie? Die Abbildungen usw. sehen gut aus, und ich verwende EntityTypeConfigs regelmäßig selbst. Ich habe dieses Szenario mit SQL Server Express ausgeführt und es funktioniert wie vorgesehen, die Elemente sind eifrig geladen. Meine Gedanken sind dies ist nicht SQL Server, basierend auf der Namenskonvention vorschlagen PostgreSQL obwohl afaik .Include() ist auch dort implementiert ...Wenn es PostgreSQL oder ein anderer DB-Anbieter ist, könnten Sie versuchen, die .Include * nach * .Where() -Klausel zu verschieben? –

+0

Ich arbeite mit MS SQL. Der komische Teil ist, dass andere Klassen mit Collection-Eigenschaften keine Probleme haben - nur die Order-Klasse –

Antwort

0

Es stellte sich heraus, dass Kern des Problems mit legen Order ist eine Zeichenfolge.

Nachdem der Auftrag erstellt wurde, wurde die ID irgendwo im Code in Kleinbuchstaben geändert. Als Ergebnis der OrderItem.OrderID nicht genau übereinstimmen Order.ID - das Gehäuse war anders.

Wie, warum

var odr = Db.Orders 
      .Include(o => o.Items) 
      .Where(x => x.ID == orderID) 
      .FirstOrDefault(); 

gearbeitet, aber

var manualItems = Db.Orders 
        .Where(x => x.ID == orderID) 
        .Select(x => x.Items) 
        .ToList(); 

nicht - es leichte Unterschiede in den generierten SQL-Abfragen haben könnte, auf dem SQL Server verursachten Gehäuse im letzteren Fall zu ignorieren aber nicht das erstere. Es könnte auch Entity Framework sein, das nach der Abfrage die Validierung der beiden ID-Felder vornimmt.

+0

Ah, also der Fall der Order-ID in der Bestellposition gespeichert war anders als die ID der Bestellung? Das ist ein bisschen seltsam. Ich würde so etwas nicht finden, da ich keine String-IDs verwende, obwohl ich die Strings verwendet habe, um dieses Problem zu reproduzieren. Ich werde mit diesem Fallverhalten spielen, denn das wäre gut zu wissen. :) Neugierig, hast du eine FK zwischen den beiden Tischen aufgestellt? –

+0

Das ist das Seltsamste - die FKs wurden eingerichtet, aber SQL erlaubte die Änderung der FK-Spalte in Kleinbuchstaben. Es kann sein, dass das Gehäuse in MS SQL keine Rolle spielt, aber im Entity-Framework –