2012-03-14 60 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

相关问题