2012-08-15 38 views
2

我有两个类NHibernate的刷新了IEnumerable

public class Notification 
{ 
    public virtual Guid ID { get; set; } 
    public virtual IEnumerable<Message> Messages {get;set;} 
} 

public class Message 
{ 
    public virtual Guid ID { get; set; } 
    public virtual string Message { get; set; } 
} 

我有我的两个页面上的.ascx控件和一个通过公开方法调用了另一个困境。现在,如果我将一行添加到消息列表中,然后运行我的绑定方法,该方法只是通过ID获取通知并返回消息。我没有得到新添加的消息。在获取这些数据之前,我必须再次刷新页面。

是否有关于IEnumerable缓存或我如何强制它返回到数据库我运行Session.Get <>但它没有我想要的效果。

我也曾尝试

Session.Evict
Session.Refresh

回答

1

请检查Q和A贴在下面,我想他们的情况非常相似,你的。也许通过简单地改变他的方式,你正在处理您的收藏

Reload association/related collection in NHibernate
What's the best way to refresh entities in nhibernate
https://forum.hibernate.org/viewtopic.php?f=1&t=968923

的主要问题是,NH没有“收藏”概念。它所关心的是处理对象并将它们映射到表。如果你关注一个关系,NH生成一个查询,下载对象列表,认为它已经完成并且对此感到高兴。您获取由查询返回的对象的集合。要重新读取集合,您实际上必须重新运行查询。这就是查询和标准的意义所在:准备一些可以重新用于刷新集合的东西。刷新 - 通过从DB重新获取它们。新罕布什尔州立大学IIRC,NH追踪对象。这意味着如果查询的第一次运行返回了对象A,B,C并将它们放入列表<>中,则hext运行返回A,C,D,E并将它们返回到其他列表<>中,然后对象一个C和第一次都是相同的对象。除非使用不同的NH会话,否则不会有对象克隆。当然,由您来负责清单<> - 也就是说,您必须决定如何将它们合并到显示给用户的一件事中。通常你会想放弃第一个,只使用最新的一个,立即表明'B'被删除,或者合并它们,假设'B'从未被删除,并默默地修补提交。