簡體   English   中英

集合屬性不會從父對象加載,而是在單獨查詢時加載

[英]Collection property doesn't load from parent object, but loads when separately queried

我在加載實體框架集合屬性時遇到問題。

當我嘗試通過父對象渴望加載集合時,collection屬性仍然為null。 但是,直接在查詢中選擇子集合屬性時,將返回正確的子對象。

這是我的代碼:

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();

執行此操作時, odr.Items為null,但manualItems具有正確的值!

更奇怪的是:我在OrderItem類的某些屬性設置器( odr.ItemsmanualItems的類型)上設置了一個斷點-發現實體框架正在正確地檢索,創建和填充子OrderItem對象。 只是沒有設置odr.Items屬性。

這是類和映射,以供參考:

訂購

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

    <snip>

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

訂購項目

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; }
}

訂單映射

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");
    }
}

訂單項目映射

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");
    }
}

我正在使用.NET 4.6和Entity Framework 6.1.3

事實證明,問題的核心在於Order上的ID字段是一個字符串。

創建訂單后,該ID會更改為代碼中所有小寫字母。 結果, OrderItem.OrderIDOrder.ID完全匹配-大小寫不同。

至於為什么

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();

並非如此-生成的SQL查詢可能略有不同,導致SQL Server在后一種情況下忽略了大小寫,但在前一種情況下卻忽略了大小寫。 Entity Framework本身也可以對兩個ID字段進行查詢后驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM