2013-07-04 59 views
2

我在我的案例中有3個實體。發票,InvoiceDetail和Item。 發票具有一個InvoiceDetail集合。每個InvoiceDetail都有一個Item。在最近添加的記錄中檢索導航屬性的數據

請參閱下面的代碼:

var ctx = new TestEntities(); 

var newInvoice = new Invoice 
    { 
     CreationDate = DateTime.Now, 
     UserId = 14 
    }; 

newInvoice.InvoiceDetails.Add(new InvoiceDetail 
    { 
     ItemId = 345, 
     ItemCount = 10 
    }); 
newInvoice.InvoiceDetails.Add(new InvoiceDetail 
{ 
    ItemId = 534, 
    ItemCount = 10 
}); 

ctx.Invoices.Add(newInvoice); 
ctx.SaveChanges(); 

// workaround 
// ctx.Items.ToList(); 

foreach (var i in newInvoice.InvoiceDetails) 
{ 
    // In this line I get NullReferenceException 
    Console.WriteLine(i.Item.Title); 
} 

我得到的NullReferenceException時,我想檢索每個InvoiceDetail的項目數據。

問題解決了,當我取消註釋,評論部分代碼。 (ctx.Items.ToList())

UPDATE 1:

而且也是這種Item類:

public partial class Item 
    { 
     public Item() 
     { 
      this.InvoiceDetails = new HashSet<InvoiceDetail>(); 
     } 

     public long Id { get; set; } 
     public string Title { get; set; } 

     public virtual ICollection<InvoiceDetail> InvoiceDetails { get; set; } 
    } 

更新2:

public partial class InvoiceDetail 
    { 
     public long Id { get; set; } 
     public long InvoiceId { get; set; } 
     public long ItemId { get; set; } 
     public int ItemCount { get; set; } 

     public virtual Invoice Invoice { get; set; } 
     public virtual Item Item { get; set; } 
    } 
+0

我們可以看看你的'Item'類(其他人可能也不會受傷)嗎? – Chris

+0

對不起,我的意思是'InvoiceDetail',雖然兩者都有用,但我的不好。 – Chris

+0

@Chris我在我的代碼中添加了2個更新。 –

回答

3

[注:我假設EF5]

該問題可能與您創建InvoiceInvoiceDetail的實例的方式有關。你是new建立實例,所以它們不是具有延遲加載所需的所有組件的EF代理。

我建議你嘗試使用DbSet.Create()方法而不是new

var newInvoice = ctx.Set<Invoice>().Create(); 
newInvoice.CreationDate = DateTime.Now; 
newInvoice.UserId = 14; 


var detail1 = ctx.Set<InvoiceDetail>().Create(); 
detail1.ItemId = 345; 
detail1.ItemCount = 10; 
newInvoice.InvoiceDetails.Add(detail1); 

//... 

我不能保證這將解決你的問題,因爲EF是這樣一個錯綜複雜的野獸,但它是值得給予這是一個嘗試。 ..

+0

OMG bro!真的tnx @qujck。你能向我解釋一下在我的情況下這種方法是如何工作的嗎? –

+2

@RezaAhmadi調用'Create()'給出了一個完全成熟的EF代理與延遲加載等。當你'新'了一個類並添加了'Context'類實例(例如'newInvoice')將不會被包裝代理。正如@Chris在下面正確地指出的那樣,調用'ToList()'將所有'Items'拉入'Context'並且EF足夠聰明以在本地找到它們並將它們附加到'newInvoice',但是不夠聰明以至於數據庫(可能是因爲'ctx'知道'newInvoice'不在數據庫中了?)。 – qujck

+0

非常感謝。你過得很愉快,我歡呼 –

相關問題