3

私の場合、3つのエンティティがあります。Invoice、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; }
    }
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 に答える