我的情况下有3个实体。发票,InvoiceDetail和Item。 Invoice有一个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);
}
当我想检索每个InvoiceDetail的Item数据时,我得到NullReferenceException。
当我取消注释时,问题解决了,评论了部分代码。 (ctx.Items.ToList())
更新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 :(得分:3)
[注意:我假设EF5]
问题可能与您创建Invoice
和InvoiceDetail
实例的方式有关。您是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是如此复杂多变的野兽,但值得尝试一下......