2011-02-08 17 views
2

私は比較的MVCとEFコードが新しく、この問題の解決策を見つけることができません。.NET MVC 3/EFコードファースト - 関連エンティティの追加

EFコードを使用して、2つのエンティティ、請求書とInvoiceItemを作成しました。 1つの請求書にはInvoiceItemのインスタンスが多数存在することがあります。 InvoiceItemはInvoiceのインスタンスを1つしか持てません。

コードスニペットを次のように試験として

public class Invoice 
{ 
    [ScaffoldColumn(false)] 
    public int InvoiceId { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<InvoiceItem> InvoiceItems { get; set; } 
} 

public class InvoiceItem 
{ 
    [ScaffoldColumn(false)] 
    public int InvoiceItemId { get; set; } 

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:C}")] 
    public decimal Amount { get; set; } 

    public virtual Invoice Invoice { get; set; } 
} 

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Invoice>().HasMany(i => i.InvoiceItems); 
    modelBuilder.Entity<InvoiceItem>().HasRequired(i => i.Invoice); 
} 

を、私は次のコード

if (ModelState.IsValid) 
{ 
    _repository.Add(invoice); 
    _repository.Save(); 

    invoice.InvoiceItems.Add(new InvoiceItem {Amount = 99}); 

    return RedirectToAction("Index"); 
} 

と請求書のために1 InvoiceItemを作成しようとしていますinvoice.InvoiceItems.Add()行に到達すると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」がスローされます。エラー。

私には何が欠けていますか?

答えて

3

私の最初の推測は、 'InvoiceItems'プロパティが初期化されていないことです。あなたがコレクションに追加する前にnullチェックを行うことができます:

if(invoice.InvoiceItems == null) 
{ 
    invoice.InvoiceItems = new List<InvoiceItem>(); 
} 
invoice.InvoiceItems.Add(new InvoiceItem {Amount = 99}); 

また、それがnullだ場合のget {}でプライベートフィールドとinitaliseを作成することにより、InvoiceItems読み取り専用プロパティを作る:私は知っていた

private ICollection<InvoiceItem> invoiceItems; 

public ICollection<InvoiceItem> InvoiceItems 
{ 
    get 
    { 
     return this.invoiceItems ?? (this.invoiceItems = new List<InvoiceItem>()); 
    } 
} 
+0

をそれは私が行方不明だった明らかなものだろう。感謝@サントス2番目のソリューションは魅力のように働いた - 私は公共のプロパティを仮想化しなければならなかった。 –

関連する問題