2011-10-06 35 views
1

我一直試圖調試一下,並以不同的方式表達我想要做的事情,但我沒有運氣。我對這個實體框架一無所知,而且我從另一個不在身邊的開發人員那裏繼承了這些代碼,所以我對這個模型一無所知。也許有人可以讓我指出正確的方向。這是我的代碼:實體框架向數據庫添加新行引發的異常

//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了未處理的用戶代碼
消息=兩個對象之間的關係不能限定,因爲它們連接到不同的ObjectContext對象 。
源= 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 

我簡直不明白怎麼可以有兩個背景?我在代碼中的每個地方使用「上下文」。實體框架如何使我們的數據庫中簡單添加一行變得非常困難?

回答

2

的問題是在

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

這解決了這個問題,非常感謝! –

0

嘗試設置您的Web.Config連接字符串以包含MultipleActiveResultSets = True。

+0

我認爲,設置僅與MS SQL工程.. –

+0

那麼,什麼是你的推理?這是因爲我正在用「任務」進行一堆編輯,而且我無法同時向它添加新的關係? –

+0

啊...不使用MS SQL。我遇到了類似的問題,並且修改了它。不確定EF如何處理數據庫事務,但我確實知道它必須處理多個結果集以維護其OO方法。我通常加載數據庫上下文作爲模塊級別的變量,並在整個類中使用它,所以我不會遇到多個上下文對象的問題。 (注意:有時你需要多個上下文)。 –

0

經過將近4小時的努力,我才能真正做到這一點,這是唯一的解決方案。顯然,將新數據插入數據庫是實體框架的一項高級功能,需要對其內部工作有深入的瞭解。

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)); 

哦,至少它是快的。