.NET MVC 3 / EF Code First - Добавление связанной сущности - PullRequest
2 голосов
/ 08 февраля 2011

Сначала я относительно новичок в коде MVC и EF и не могу найти решение этой проблемы.

Сначала я использовал код EF для создания 2 объектов: Invoice и 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 для Invoice со следующим кодом

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

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

    return RedirectToAction("Index");
}

Когда он попадает в строку invoice.InvoiceItems.Add (), он выдает «Ссылка на объект не установлена ​​на экземпляр объекта». ошибка.

Что мне не хватает?

1 Ответ

3 голосов
/ 08 февраля 2011

Мое первоначальное предположение здесь состоит в том, что свойство InvoiceItems не было инициализировано.Вы можете выполнить нулевую проверку перед добавлением в коллекцию:

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

В качестве альтернативы можно сделать свойство InvoiceItems доступным только для чтения, создав личное поле и инициализировать в get {}, если оно равно NULL:

private ICollection<InvoiceItem> invoiceItems;

public ICollection<InvoiceItem> InvoiceItems
{
   get
   {
      return this.invoiceItems ?? (this.invoiceItems = new List<InvoiceItem>());
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...