2012-07-11 72 views
0

我有兩種使用EF4的方法 - 一種是在使用塊中返回對象列表(Pages),另一種是創建不同類型對象(Book)的對象。 Book的其中一個屬性是FirstPage,它是第一個項目列表中的一個項目。當我嘗試設置此實例化對象的第一頁屬性,我得到一個異常:將一個對象附加到沒有上下文的另一個對象

兩個對象之間的關係不能被定義,因爲它們 連接到不同ObjectContext的對象。

我想這一定是因爲使用塊已經放置在對象被分離之前。有沒有什麼辦法可以1)在上下文已經處理之後將其分離或者2)直到我將它傳遞迴數據層,直到它回到鬼的上下文爲止?

這是我的代碼:

IEnumerable<Page> allPages = null; 

using (var db = new DataContainer()) 
{ 
    var items = db.Pages; 
    var filteredCode = items.Where(i => i.Code == PageCode); 
    allPages = filteredCode.ToList(); 
} 

Page page = allPages.FirstOrDefault(p => ...); // query omitted 

var book = new Book() 
{ 
    Title = @"asdas", 
    FirstPage = page, // 'page' is never null 
    // rest omitted 
}; 

回答

2

回答這兩個問題你的是:沒有。對於這兩個操作使用相同的上下文,或者在離開使用塊的範圍之前分離您的實體。

如果您使用POCO,您還可以關閉代理創建(=沒有延遲加載和動態更改跟蹤),並且您的代碼無需任何更改即可工作,因爲代理始終參考上下文--POCO本身並不知道任何內容關於上下文。

Btw。還有另一個副作用,即在它的上下文的生命週期結束之前不會將實體(Proxied POCO,也可能是EntityObject)分離 - 它會導致內存泄漏,因爲該實體擁有對上下文的引用並且上下文可以引用許多其他對象,包括其他對象附屬實體。直到你的實體被釋放(沒有你的實體的引用),垃圾收集器不能釋放上下文和所有相關的對象。

+0

正如我懷疑。不幸,但感謝您的確認。 – Echilon 2012-07-12 08:43:18

相關問題