gpt4 book ai didi

c# - Nhibernate 刷新 IEnumerable

转载 作者:搜寻专家 更新时间:2023-10-30 20:43:00 25 4
gpt4 key购买 nike

我有两个类(class)

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

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

我也试过

session .退出
session .刷新

最佳答案

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

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 会生成一个查询,下载对象列表,认为它已经完成并对此感到高兴。您将获得查询返回的对象集合。要重新读取集合,您实际上必须重新运行查询。这就是 Queries 和 Criteria 的意义所在:准备一些你可以重复使用的东西来刷新你的集合。刷新 - 通过从数据库中重新获取它们。

IIRC,NH 跟踪对象。这意味着如果查询的第一次运行返回对象 A、B、C 并将它们放入 List<>,那么下一次运行返回 A、C、D、E 并将它们返回到其他 List<> 中,然后对象 A 和 C 将与第一次相同。除非您使用不同的 NH session ,否则不会有对象克隆。当然,由您来处理这两个 List<> - 也就是说,您必须决定如何将它们合并为一个显示给用户的东西。通常你会想删除第一个并只使用最新鲜的一个来立即表明 'B' 已被删除,或者将它们合并,假装 'B' 从未被删除并在提交时默默地修补它。

关于c# - Nhibernate 刷新 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11967857/

25 4 0