2

我有两个班

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 控件,一个通过公共方法在另一个上调用 Bind。现在,如果我在消息列表中添加一行,然后运行我的绑定方法,该方法只是通过 ID 获取通知并返回消息。我没有收到新添加的消息。在它获取此数据之前,我必须再次刷新页面。

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

我也试过

Session.Evict
Session.Refresh

4

1 回答 1

1

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

在 NHibernate 中重新加载关联/相关集合
在 nhibernate 中刷新实体的最佳方法是什么
https://forum.hibernate.org/viewtopic.php?f=1&t=968923

主要问题是NH没有“收藏”的概念。它只是处理对象并将它们映射到表。如果你关注一个关系,NH 会生成一个查询,下载对象列表,认为它已经完成并对此感到高兴。您将获得查询返回的对象集合。要重新读取集合,您实际上必须重新运行查询。这就是查询和标准的意义所在:准备一些可以重复使用的东西来刷新您的收藏。刷新 - 通过从数据库中重新获取它们。

IIRC,NH 跟踪对象。这意味着,如果查询的第一次运行返回对象 A、B、C 并将它们放在 List<> 中,那么 hext 运行返回 A、C、D、E 并将它们返回到其他一些 List<> 中,那么对象 A 和 C 将是与第一次相同的对象。除非您使用不同的 NH 会话,否则不会有对象克隆。当然,由您来处理 List<> - 也就是说,您必须决定如何将它们合并到向用户显示的一件事中。通常,您会希望删除第一个并仅使用最新鲜的一个来立即指示“B”已被删除,或者将它们合并,假装“B”从未被删除并在提交时默默地修补它。

于 2012-08-15T10:53:48.410 回答