3

在我的情况下,我有 3 个实体。发票、发票明细和项目。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; }
    }
4

1 回答 1

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 是一个如此复杂多变的野兽,但值得一试......

于 2013-07-04T09:39:10.073 回答