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
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? –
Ich arbeite mit MS SQL. Der komische Teil ist, dass andere Klassen mit Collection-Eigenschaften keine Probleme haben - nur die Order-Klasse –