Добавление дочернего объекта перед вставкой родительского объекта и дочернего объекта - PullRequest
1 голос
/ 04 августа 2011

Я работал через приложение Nerd Dinner. В методе Создать действие они имеют следующий код:

NerdIdentity nerd = (NerdIdentity)User.Identity;
dinner.HostedById = nerd.Name;
dinner.HostedBy = nerd.FriendlyName;

RSVP rsvp = new RSVP();
rsvp.AttendeeNameId = nerd.Name;
rsvp.AttendeeName = nerd.FriendlyName;
dinner.RSVPs.Add(rsvp);

dinnerRepository.Add(dinner);
dinnerRepository.Save();

Сначала я использую Entity Framework 4.1 код.

Вот мой GrantApplication класс:

public class GrantApplication
{
   public int Id { get; set; }
   // Other properties
   public virtual ICollection<AuditEntry> AuditEntries { get; set; }
}

В моем слое обслуживания я делаю следующее, так же, как это делает Nerd Dinner:

public void Insert(GrantApplication grantApplication)
{
   // Add audit entry
   grantApplication.AuditEntries.Add(new AuditEntry
   {
      NewValue = grantApplication.GrantApplicationStateId,
      AuditDate = currentDateTime,
      EmployeeNumber = submitterEmployeeNumber
   });

   // Insert the new grant application
   grantApplicationRepository.Insert(grantApplication);
}

Мой класс AuditEntry:

public class AuditEntry
{
   public int Id { get; set; }
   public int OldValue { get; set; }
   public int NewValue { get; set; }
   public DateTime AuditDate { get; set; }
   public string EmployeeNumber { get; set; }
}

Мой контекстный класс:

public class HbfContext : DbContext
{
   public DbSet<Bank> Banks { get; set; }
   public DbSet<AccountType> AccountTypes { get; set; }
   public DbSet<GrantApplication> GrantApplications { get; set; }
   public DbSet<AuditEntry> AuditEntries { get; set; }

   protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
   {
   }
}

Я получаю сообщение об ошибке, что grantApplication.AuditEntries имеет значение null, поэтому он не может добавить объект записи аудита. Почему у меня значение null, а ужин. RSVP не равен нулю, когда пытается добавить объект RSVP? Как бы это исправить?

Нужно ли добавлять AuditEntries в HbfContext? Я имею в виду, я не собираюсь использовать это самостоятельно. Он будет использоваться только при редактировании приложения Grant.

UPDATE

Я, должно быть, использую старую версию Nerd Dinner, но вот как выглядит мой Create:

[HttpPost, Authorize]
public ActionResult Create(Dinner dinner)
{
   if (ModelState.IsValid)
   {
      NerdIdentity nerd = (NerdIdentity)User.Identity;
      dinner.HostedById = nerd.Name;
      dinner.HostedBy = nerd.FriendlyName;

      RSVP rsvp = new RSVP();
      rsvp.AttendeeNameId = nerd.Name;
      rsvp.AttendeeName = nerd.FriendlyName;
      dinner.RSVPs.Add(rsvp);

      dinnerRepository.Add(dinner);
      dinnerRepository.Save();

      return RedirectToAction("Details", new { id=dinner.DinnerID });
   }

   return View(dinner);
}

1 Ответ

1 голос
/ 04 августа 2011

Гм, потому что NerdDinner DinnersController.Create содержит строку кода, которую вы не показывали ?

            dinner.RSVPs = new List<RSVP>(); // why is this not in your example?
            dinner.RSVPs.Add(rsvp);

Нужно ли добавлять AuditEntries в HbfContext?

Да, вы делаете.Ну, вы должны каким-то образом добавить их в свою модель EF.Это один из способов сделать это.Вы также можете сделать это с кодом в OnModelCreating.

...