![](/img/trans.png)
[英]Should a business object collection inherit from Collection<T> when it doesn't extend it?
[英]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.Items
和manualItems
的類型)上設置了一個斷點-發現實體框架正在正確地檢索,創建和填充子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.OrderID
與Order.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.