【问题标题】:Adding a child object before inserting the parent object and child object在插入父对象和子对象之前添加子对象
【发布时间】:2011-10-19 23:08:11
【问题描述】:

我完成了Nerd Dinner 应用程序。在 Create 操作方法中,它们具有以下代码:

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,因此它无法添加审核条目对象。为什么我的为空,但是当它尝试添加 RSVP 对象时,dinner.RSVPs 不为空?我该如何解决?

我需要将 AuditEntries 添加到 HbfContext 吗?我的意思是我不会单独使用它。只有在编辑 GrantApplication 时才会使用它。

更新

我必须使用旧版本的 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);
}

【问题讨论】:

    标签: entity-framework entity-framework-4 ado.net entity-framework-4.1 ado.net-entity-data-model


    【解决方案1】:

    嗯,因为 NerdDinner DinnersController.Create includes a line of code which you didn't show

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

    我需要将 AuditEntries 添加到 HbfContext 吗?

    是的,你知道。好吧,您必须以某种方式将它们添加到您的 EF 模型中。这是一种方法。您也可以使用OnModelCreating 中的代码来完成此操作。

    【讨论】:

    • 这可能是 Nerd Dinner 的较新版本,但我已将原始帖子更新为我所拥有的。我会去实例化我的列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多