是否可以更新ObjectContext中保存的对象以便重用而不保存到db?

时间:2012-03-14 14:30:22

标签: entity-framework

我正在构建一个移动MVC应用程序,偶然发现了许多问题,但这让我很烦恼。

这是我正在努力的消息类:

    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; }
}

我创建了新的Message对象并将其保存在数据库中。

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

此时它没有附加收件人。用户被重定向到一个视图,在那里他可以将收件人添加到邮件中。

当用户添加收件人时,我通过创建MessageRecipient对象的ajax调用该方法,并将其添加到邮件的Recipients集合中。

message.MessageRecipients.Add(recipient);

理想情况是:当用户完成添加收件人并返回编辑视图后,添加的收件人将可见。

当调用Edit动作时,将调用GetMessage方法

Message message = messageService.GetMessage(id);

因为这个消息在它被保存在ObjectContext之前已被检索,所以EF会从内存中为我提供实体而不是查询DB以获取新的实体,这就是我想要发生的事情。我不知道如何保存该ObjectContext中的更改而不通过调用SaveChanges()保存对Db的更改。

所以我的问题是:有没有办法改变存储器中保存的实体的状态,以便下次查询时我得到了我已经对其进行了更改的实体?

我只想使用该对象并在完成后将其保存到Db,而不是每次用户将收件人添加到邮件时都会访问Db。

我是.NET和EF的新手......

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

因为此消息在被保留之前已被检索   ObjectContext,所以EF会从内存中为我提供实体   比查询DB更新。

除非您在请求之间共享上下文,否则不会在上下文中保留它。您应该为每个请求(甚至每个Ajax请求)使用新的上下文。有multiple reasons为什么你不应该分享上下文。计算一个额外的 - 泄漏的上下文等于泄漏的记忆。

  

所以我的问题是:有没有办法改变实体的状态   保存在记忆中所以下次当它被查询我得到了   我已经做出改变的实体?

是的,有一种方法,但它与EF无关。您必须在会话或其他商店中保留分离的Message,使您的应用程序工作流状态良好,并且仅在整个编辑完成时使用EF将消息保留到数据库。