Исключение выдается при добавлении Entity Framework новой строки в БД - PullRequest
1 голос
/ 06 октября 2011

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

//Append note to project notes too
task.TPM_PROJECTVERSIONReference.Load();
TPM_PROJECTVERSIONNOTES newNote = new TPM_PROJECTVERSIONNOTES();
newNote.TS = System.DateTime.Now;
newNote.TPM_USER = SessionHandler.LoginUser;
newNote.NOTES = task.NOTES;
newNote.PROJECTID = this.ProjectId;
newNote.VERSIONID = this.VersionId;
task.TPM_PROJECTVERSION.TPM_PROJECTVERSIONNOTES.Add(newNote); //<-- Exception

У меня есть «задача», которая указывает на версию проекта, к которой он принадлежит.Эти проекты имеют кучу заметок.Я хочу добавить новую заметку в проект задачи.Однако в последней строке я получаю исключение:

System.InvalidOperationException не обработан кодом пользователя
Message = Невозможно определить связь между двумя объектами, поскольку они присоединены к разным объектам ObjectContext..
Source = System.Data.Entity

Кажется, это должно быть довольно просто.Разве это не правильный способ сделать это?Спасибо!

Редактировать:

Хорошо. Я удалил ВСЕ другой код из функции и создал совершенно новый контекст.Вот вся функция теперь от начала до конца:

//Append note to project notes too
using (TPMEntities context = new TPMEntities(General.EntityName()))
{
   TPM_PROJECTVERSIONNOTES newNote = context.TPM_PROJECTVERSIONNOTES.CreateObject();
   newNote.TS = System.DateTime.Now;
   newNote.TPM_USER = SessionHandler.LoginUser;
   newNote.NOTES = this.txtTaskNotes.Text;
   TPM_PROJECTVERSION version = (from pv in context.TPM_PROJECTVERSION
                                 where pv.PROJECTID == this.ProjectId && pv.VERSIONID == this.VersionId
                                 select pv).First();

   version.TPM_PROJECTVERSIONNOTES.Add(newNote);
   context.SaveChanges();
}

Тем не менее, я получаю то же исключение:

System.InvalidOperationException was unhandled by user code
  Message=The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.
  Source=System.Data.Entity

Я просто не могу понять, как может быть два контекста?Я использую «контекст» каждого места в коде.Как Entity Framework может так трудно добавить одну строку в мою базу данных?

Ответы [ 3 ]

2 голосов
/ 07 октября 2011

Проблема в

newNote.TPM_USER = SessionHandler.LoginUser;

LoginUser создается с использованием другого контекста. Вы прикрепляете это к context. Есть несколько способов решить эту проблему.

Отделить LoginUser от контекста, в котором он был создан.

sessionContext.Detach(SessionHandler.LoginUser);

Тогда внутри вашего метода

using (TPMEntities context = new TPMEntities(General.EntityName()))
{
   context.Attach(SessionHandler.LoginUser);

   TPM_PROJECTVERSIONNOTES newNote = context.TPM_PROJECTVERSIONNOTES.CreateObject();
   newNote.TS = System.DateTime.Now;
   newNote.TPM_USER = SessionHandler.LoginUser;
   newNote.NOTES = this.txtTaskNotes.Text;
   TPM_PROJECTVERSION version = (from pv in context.TPM_PROJECTVERSION
                                 where pv.PROJECTID == this.ProjectId && pv.VERSIONID == this.VersionId
                                 select pv).First();

   version.TPM_PROJECTVERSIONNOTES.Add(newNote);
   context.SaveChanges();
}

Или, если вы сопоставили свойство скалярного внешнего ключа newNote.TPM_USER_ID

using (TPMEntities context = new TPMEntities(General.EntityName()))
{
   TPM_PROJECTVERSIONNOTES newNote = context.TPM_PROJECTVERSIONNOTES.CreateObject();
   newNote.TS = System.DateTime.Now;
   newNote.TPM_USER_ID = SessionHandler.LoginUser.ID;
   newNote.NOTES = this.txtTaskNotes.Text;
   TPM_PROJECTVERSION version = (from pv in context.TPM_PROJECTVERSION
                                 where pv.PROJECTID == this.ProjectId && pv.VERSIONID == this.VersionId
                                 select pv).First();

   version.TPM_PROJECTVERSIONNOTES.Add(newNote);
   context.SaveChanges();
}
0 голосов
/ 06 октября 2011

Уэлп после почти 4 часов попыток сделать эту работу, единственное решение, которое я действительно мог получить, это это. По-видимому, вставка новых данных в базу данных - это расширенная функция Entity Framework, требующая глубокого знания ее внутренней работы.

context.ExecuteStoreQuery<object>("INSERT INTO TPM_PROJECTVERSIONNOTES (NOTES, PROJECTID, VERSIONID, USERID, TS) VALUES (:notes, :projId, :versionId, :userId, :timestamp)",
   new OracleParameter("notes", this.txtTaskNotes.Text),
   new OracleParameter("projId", this.ProjectId),
   new OracleParameter("versionId", this.VersionId),
   new OracleParameter("userId", SessionHandler.LoginUser.USERID),
   new OracleParameter("timestamp", DateTime.Now));

Ну, по крайней мере, это быстро.

0 голосов
/ 06 октября 2011

Попробуйте установить в строке подключения Web.Config значение MultipleActiveResultSets = True.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...