我正在构建一个移动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的新手......
任何帮助都将不胜感激。
答案 0 :(得分:0)
因为此消息在被保留之前已被检索 ObjectContext,所以EF会从内存中为我提供实体 比查询DB更新。
除非您在请求之间共享上下文,否则不会在上下文中保留它。您应该为每个请求(甚至每个Ajax请求)使用新的上下文。有multiple reasons为什么你不应该分享上下文。计算一个额外的 - 泄漏的上下文等于泄漏的记忆。
所以我的问题是:有没有办法改变实体的状态 保存在记忆中所以下次当它被查询我得到了 我已经做出改变的实体?
是的,有一种方法,但它与EF无关。您必须在会话或其他商店中保留分离的Message
,使您的应用程序工作流状态良好,并且仅在整个编辑完成时使用EF将消息保留到数据库。