尝试使用EF4.3.1插入实体时出现异常

时间:2012-04-24 08:32:29

标签: c# database exception entity-framework-4

我在这里看到的一些帖子看起来像我的,但是找不到我特定问题的答案。

问题是我正在尝试使用导航将实体插入数据库。支柱。 但是我经常得到:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

using (EntitiesDatabase context = new EntitiesDatabase())
{
    if (UserHandler.Instance.User is Admin)
    {
        ((Admin)UserHandler.Instance.User).ProjectManagers.Add(
            new ProjectManager(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
    }
    else if (UserHandler.Instance.User is ProjectManager)
    {
        ((ProjectManager)UserHandler.Instance.User).Developers.Add(
            new Developer(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
    }

    context.SaveChanges();
}

错误异常在代码(u.ProjectManagers.Add(new ProjectManager(...))

的第5-6行引发

为清晰起见: UserHandler是一个singelton,它保存对登录用户的引用。 用户具有导航属性

    public virtual ICollection<ProjectManager> ProjectManagers { get; set; }

在我对上下文SaveChanges()进行using之后,实际上应该将新项目管理器插入到数据库中。

我已经对较小的项目进行了一些简单的测试(比如PluralSight教程中的那些)并且它确实有效...由于某些原因,这些相同的行不起作用。 在我尝试将其插入导航器之前,似乎我正在创建的新项目经理似乎正在处理。支柱。因为我从来没有进入保存更改行......

从我看过的其他答案中,我猜测{{1}}语句出于某种原因在事物到达最后一步之前将其处理掉。我不明白为什么...... 有人能以正确的方式指出我吗?

BTW这不是家庭作业的人,这是我的一个项目,我正在努力学习C#,EF和其他技术。

2 个答案:

答案 0 :(得分:0)

我的猜测是,与UserHandler.Instance.User相关的数据上下文在当前调用上下文中不存在,并且UserHandler.Instance.User未附加到最近实例化的context。 / p>

答案 1 :(得分:0)

看起来你得到User实例的上下文是在不同的上下文中获取的,这些上下文被处理掉了。

您有两个选项可以使用相同的上下文,也可以使用ObjectContext.Attach将实体附加到新上下文中,如下所示:

using (EntitiesDatabase context = new EntitiesDatabase())
{
  context.Attach(UserHandler.Instance.User);
  if (UserHandler.Instance.User is Admin)
  {
    ((Admin)UserHandler.Instance.User).ProjectManagers.Add(
       new ProjectManager(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
  }
  else if (UserHandler.Instance.User is ProjectManager)
  {
    ((ProjectManager)UserHandler.Instance.User).Developers.Add(
        new Developer(firstNameTextBox.Text, lastNameTextBox.Text, usernameTextBox.Text, passwordTextBox.Text));
  }

  context.SaveChanges();
}