在最近添加的记录中检索导航属性的数据

时间:2013-07-04 08:52:08

标签: c# .net entity-framework

我的情况下有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; }
    }

1 个答案:

答案 0 :(得分: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是如此复杂多变的野兽,但值得尝试一下......