2010-03-04 193 views
4

我想一個列表轉換爲EntityCollection。錯誤使用ADO.NET實體框架

List<T> x = methodcall(); 
EntityCOllection<T> y = new EntityCollection<T>(); 

foreach(T t in x) 
    y.Add(t); 

我得到這個錯誤。

該對象無法添加到 EntityCollection或EntityReference中。 一個附加到一個 ObjectContext的對象不能被添加到 EntityCollection或的EntityReference 不與源 對象相關聯。

任何人都知道這個錯誤?

+0

我解決了它。 我的DId是 y.attach(x); 我不知道爲什麼添加沒有工作,但爲我附加工作。 – alice7 2010-03-04 20:51:44

回答

2

這聽起來像x是ObjectContext的查詢結果。每個ObjectContext跟蹤它從數據庫中讀取的實體以啓用更新方案。它跟蹤實體以知道何時(或如果)它們被修改,哪些屬性被修改。

術語是,實體附加到ObjectContext。在你的情況下,x中的實體仍然附加到實現它們的ObjectContext,所以你不能同時將它們添加到另一個EntityCollection。

您可以這樣做,如果你第一次Detach他們,但如果你這樣做,第一ObjectContext的停止追蹤他們。如果您不想再次更新這些項目,這不是問題,但如果您以後需要更新它們,則必須再次使用Attach這些項目。

+0

對不起您的建議是什麼?我完全不明白 – alice7 2010-03-04 19:47:14

+0

您可以在此處查看有關附加和分離對象圖的更多信息:http://msdn.microsoft.com/en-us/library/bb896271.aspx – 2010-03-04 19:49:32

0

基本上所有實體對象由用作變更跟蹤對象上下文控制。這裏的想法是,實體本身對他們的環境愚蠢,但對象上下文知道發生了什麼。

這是DataSet模型的反轉,其中表格跟蹤自己的更改。

所以對象添加到直接對象上下文和它的實體集合。在這裏,您創建了一個與對象上下文無關的EntityCollection,因此不能添加其他對象。它們必須首先附加到對象上下文中。

真的,你可能想要的是返回IQueryable而不是IList。這將允許您對methodcall()的結果執行查詢。