.NET MVC 3 / EF代码优先 - 添加相关实体

时间:2011-02-08 05:08:45

标签: asp.net-mvc entity-framework

我首先对MVC和EF代码比较新,但找不到解决这个问题的方法。

我首先使用EF代码创建了2个实体,Invoice和InvoiceItem。一个Invoice可以有许多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);
}

作为测试,我只是尝试使用以下代码为Invoice创建一个InvoiceItem

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

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

    return RedirectToAction("Index");
}

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

我错过了什么?

1 个答案:

答案 0 :(得分:3)

我最初的猜测是'InvoiceItems'属性尚未初始化。在添加到集合之前,您可以进行空检查:

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

或者通过在get {}中创建一个私有字段和initalise来使InvoiceItems成为readonly属性,如果它为null:

private ICollection<InvoiceItem> invoiceItems;

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