2012-03-14 65 views
0

我正在構建移動MVC應用程序,偶然發現了很多問題,但這讓我感到非常沮喪。是否有可能更新保存在ObjectContext中的對象以便重用而不保存到數據庫?

這是一個Message類即時reffering到:

public class Message 
{ 
    public int MessageID { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
    public DateTime Recieved { get; set; } 

    [ForeignKey("User")] 
    public int AuthorUserID { get; set; } 

    //P\\ Navigation properties 
    public virtual ICollection<MessageRecipient> MessageRecipients { get; set; } 
    public virtual User User { get; set; } 
} 

我創建了新的消息對象並將其保存在數據庫中。

  messageService.AddMessage(newMessage); 
      Message freshMessage = messageService.GetNewestMessage(); 

此時它沒有附加收件人。用戶獲取重定向到一個視圖,他可以將收件人添加到消息中。

當用戶添加收件人時,我通過創建MessageRecipient對象的ajax調用方法,並將其添加到郵件的收件人集合中。

message.MessageRecipients.Add(recipient); 

理想的情況是:當用戶完成添加收件人並返回到編輯視圖時,添加的收件人是可見的。

當編輯動作被調用getMessage方法被調用

Message message = messageService.GetMessage(id); 

因爲在此之前,將在ObjectContext中舉行這個消息已經被檢索,因此EF將成爲我的記憶,而不是查詢數據庫實體爲新鮮的,這是我想要發生的事情。我不知道如何通過調用SaveChanges()來保存對ObjectContext的更改,而不保存對Db的更改。

所以我的問題是:有沒有辦法改變存儲器中保存的實體的狀態,所以下一次查詢它時,我得到了實體與我所做的更改?

我只想與對象一起工作,並在完成它時將其保存到Db,而不是每次用戶將收件人添加到消息時都去Db旅行。

我是新來.NET和EF ...

任何幫助,將不勝感激。

+0

通過「Mobile MVC」你的意思是什麼?它是移動設備上的有狀態客戶端,還是移動設備使用的Web應用程序? – 2012-03-14 14:54:07

+0

我的意思是移動設備使用的MVC網絡應用程序 – Pawel 2012-03-14 14:58:54

回答

0

因爲在此之前,將在 的ObjectContext舉行此消息已被檢索,因此EF將成爲我從內存而不是 查詢DB新鮮一個實體。

不,它不會在上下文中持有,除非您在請求之間共享上下文。您應該爲每個請求使用新的上下文(甚至每個Ajax請求)。有multiple reasons爲什麼你不應該共享上下文。數一個額外的 - 泄漏的上下文等於泄漏的內存。

所以我的問題是:有沒有一種方法來改變在內存中,以便下一次舉行的實體 的狀態時,它被用於查詢我得到的 實體我已經給它所做的更改?

是的,有一種方法,但它與EF無關。您必須在會話或其他存儲中保留分離的Message,使您的應用程序工作流處於有狀態,並且僅在整個編輯完成時才使用EF持久保存消息到數據庫。

+0

謝謝你:)我應該現在可能會重寫我的很多代碼。我試圖在存儲庫中爲每個方法使用語句,但我無法再使用懶惰loaden屬性。什麼是推薦的地方來存儲對象?會議是我應該看的第一件事情嗎? – Pawel 2012-03-14 15:50:47

+0

如果您需要在某處使用'HttpContext.Items'存儲上下文,但即使這樣,您也應該在請求處理結束時處理您的上下文。 – 2012-03-14 15:52:47

+0

請你指點我正確的方向,爲每個請求使用新的上下文,並能夠慵懶懶惰加載,或其他方法訪問相關的實體,在上下文處理後,請? – Pawel 2012-03-14 16:14:04

相關問題