0

ここで私のような投稿をいくつか見ましたが、特定の問題に対する答えが見つかりませんでした。

問題は、nav を使用してエンティティを DB に挿入しようとしているということです。小道具。しかし、私は常に得ています: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; }

コンテキストで行った後、実際には新しいプロジェクトマネージャーをDBに挿入する必要が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を使用してエンティティを新しいコンテキストにアタッチする 2 つのオプションがあります。

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 に答える