2011-05-10 311 views
6

如何將臨時項存儲在ObjectContext中而不保存到數據庫?實體框架:存儲實體而不保存到數據庫

上下文存儲在HttpContext的,由類,它提供:

public static class HttpContextExtension 
{ 
    public static MyEntityDataModelContainer GetMyContext(this HttpContext httpContext) 
    { 
     if (httpContext.Items["MyEntityDataModelContainer"] == null) 
     { 
      httpContext.Items.Add("MyEntityDataModelContainer", new MyEntityDataModelContainer()); 
     } 

     return (MyEntityDataModelContainer)httpContext.Items["MyEntityDataModelContainer"]; 
    } 
} 

有兩個空的網頁: 1)FirstPage.aspx.cs:

public class FirstPage : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // crete new item 
     MyEntity newTemporaryItem = new MyEntity { MyEntityID = Guid.NewGuid() }; 
     // attach them to Context 
     HttpContext.Current.GetMyContext().MyEntitySet.Attach(newTemporaryItem); 
     // save changes 
     HttpContext.Current.GetMyContext().SaveChanges(); 

     // get all attached to Context items 
     var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged) 
          where se.Entity is MyEntity 
          select se.Entity).AsQueryable(); 
     int CountInFirstPage = addedItems.Count(); 
    } 
} 

所以,CountInFirstPage = 1

2)SecondPage.aspx.cs:

public class FirstPage : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // get added in First page items From HttpContext 
     var addedItems = (from se in HttpContext.Current.GetMyContext().ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged) 
          where se.Entity is MyEntity 
          select se.Entity).AsQueryable(); 
     int CountInSecondPage = addedItems.Count(); 
    } 
} 

這裏CountInSecondPage = 0

我哪裏錯了?

回答

3

我說對了,第二頁是第二個請求?

在這種情況下,你有一個新的HttpContext.Items集合,你的最後一個請求的值不見了。考慮在這種情況下使用會話來存儲這些值。

腳註: EntityContext應該只用於一個請求,並且可以存儲在HttpContext.Items集合中,但不能作爲Session值!在這裏存儲結果就像計數一樣。

+0

是的,SecondPage通過鏈接從FirstPage定位...嘗試使用Session – asolovyov 2011-05-10 13:16:06

+0

它的工作原理!我通過httpContext.Session重新編寫了HttpContextExtension。謝謝! – asolovyov 2011-05-10 14:16:47

+0

不錯。無論如何:) – sra 2011-05-10 14:17:46

0

爲了使用EF對新數據運行查詢,您需要保存。你可以列出一個列表,然後根據列表運行查詢,但這需要你將列表保存在某種靜態內存(會話狀態,視圖狀態,緩存)中,但是如果列表很大,可能會產生其他問題。

你可以做任何事情在TRANSACTION。通過交易直到您提交或回滾。實體對象得到保存,但是當事務回滾時,任何更改都會被撤消。我認爲交易將通過回傳和重定向來持續存在,但在頁面呈現時需要承諾或處置。

+0

您的意思是「傳遞事務」==在頁面之間傳遞它?我認爲它只適用於一個EntityContext ... – asolovyov 2011-05-10 18:45:33

2

這是錯誤的做法,HttpContext只有一個HTTP請求的範圍,所以你正在處理第二個請求中的不同上下文。

但即使可以以這種方式存儲數據庫上下文,即使您決定將其存儲在會話中 - 這也不是要走的路 - 每個上下文的範圍應該是單個工作單元,你不應該長時間保持它活着,特別是在Web環境中。

只需將臨時項目直接保存在會話中,並在準備好時創建新的上下文以上傳這些項目。

+0

-1該會話是實體框架對象的一個​​糟糕的解決方案。 EF只根據需要枚舉,因此任何子對象都不會存在,並且當您調用EF的保存更改方法時,它將失敗。 – Chad 2011-05-10 13:35:47

+0

據我所知,類實例只是一個沒有其他依賴關係但沒有附加到上下文的實體類,所以就像你可以在會話中保存其他任何類實例一樣,你應該能夠做同樣的事情與這一個。我不太理解你的擔心。 – BrokenGlass 2011-05-10 13:41:55

+0

他需要在第二頁的查詢中檢索已更改的對象,我假定它將數據綁定到控件。 – Chad 2011-05-10 13:53:26