我首先对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()行时,它会抛出“未将对象引用设置为对象的实例”。错误。
我错过了什么?
答案 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>());
}
}