2011-02-08 142 views
2

我对MVC和EF代码第一次比较陌生,无法找到解决此问题的方法。.NET MVC 3/EF代码优先 - 添加相关实体

我已经使用EF代码首先创建2个实体,发票和InvoiceItem。一个发票可以有许多InvoiceItem实例。 InvoiceItem只能有一个Invoice实例。

代码片段如下:

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); 
} 

作为一个测试,我只是想为下面的代码的发票创建一个InvoiceItem

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

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

    return RedirectToAction("Index"); 
} 

当它到达invoice.InvoiceItems.Add()行,它会引发一个“未设置为对象实例的对象引用”。错误。

我错过了什么?

回答

3

我最初这里的猜测是“InvoiceItems”属性尚未初始化。你可以做一个空检查您添加到集合之前:

private ICollection<InvoiceItem> invoiceItems; 

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

我知道:

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

通过在get {}如果它是空创建一个私有字段和initalise或者使InvoiceItems只读属性这是显而易见的,我失踪了。谢谢@santos第二个解决方案的工作就像一个魅力 - 除了我必须使公共财产虚拟。 – 2011-02-08 22:05:19