0

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

问题是我正在尝试使用导航将实体插入数据库。支柱。但是我不断得到: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();
}

错误异常在代码第5-6行抛出(u.ProjectManagers.Add(new ProjectManager(...))

为清楚起见: UserHandler是一个单例,包含对登录用户的引用。用户有一个导航属性

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

在我SaveChanges()对上下文执行之后,这实际上应该将新项目经理插入数据库。

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

从我看到的其他答案中,我猜测该using语句出于某种原因在到达结束括号之前就处理了一些事情。我不明白为什么...有人可以指出我正确的方式吗?

顺便说一句,这不是家庭作业,这是我的一个项目,我正在尝试学习 C#、EF 和其他技术。

4

2 回答 2

0

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

于 2012-04-24T08:48:38.940 回答
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();
}
于 2012-04-24T08:51:14.270 回答