2012-04-24 2 views
0

Я видел несколько сообщений здесь, которые похожи на мои, однако я не мог найти ответ на мою конкретную проблему.Исключение при попытке вставить объекты с использованием EF4.3.1

Дело в том, что я пытаюсь вставить объект в БД с помощью навигатора. двигательный однако я постоянно получаю: 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 является singelton, который держит ссылку на зарегистрированный пользователь. Пользователь имеет свойство навигации

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

Это должно фактически вставить новый менеджер проекта к БД после я SaveChanges() от контекста.

Я провел несколько простых тестов для небольших проектов (например, в учебных пособиях PluralSight), и это действительно сработало ... по какой-то причине эти же строки не работают. Кажется, что новый менеджер проектов, который я создаю, находится перед тем, как попытаться вставить его в навигацию. двигательный потому что я никогда не добираюсь до строки с изменениями ...

Из других ответов, которые я видел, я догадался, что оператор using по какой-то причине распоряжается вещами до того, как достиг конечной скобки. Я не понимаю, почему ... Может ли кто-нибудь указать мне правильный путь?

Кстати, это не домашние задания, это мой проект, в котором я пытаюсь изучить C#, EF и другие технологии.

+0

на какой линии вы получаете сообщение об ошибке? – Reniuz

+0

забыл указать. im получить его в строке, где я пытаюсь добавить вещи в db ... u.ProjectManagers.Add (новый ProjectManager (...)) 6-я строка в коде –

+0

Я думаю, вам нужно работать с текущим контекстом, а не с какой-то экземпляр пользовательского обработчика – Reniuz

ответ

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(); 
} 
+0

Я использую тот же контекст, я просто не добавляю новый объект в dbset, im добавляя его в ICollection I иметь в Admin, а затем делать context.SaveChanges() –

+0

Но если 'Admin' не привязан к текущему контексту, а извлекается с использованием другого контекста, который был удален. Вы получите эту ошибку. Это означает, что привязка объекта «Admin» к контексту должна устранить проблему. – Xharze

+0

Администратор не отслеживался в этом контексте, поэтому мне пришлось приложить его! Большое спасибо! –

0

Я предполагаю, что контекст данных, связанный с UserHandler.Instance.User, не является живым в текущем вызывающем контексте, а UserHandler.Instance.User не привязан к context, который был недавно создан.

+0

UserHandler - это Singelton ... он существует во всех контекстах, которые я думаю :) –

Смежные вопросы