添加子元素后,NHibernate实体没有更新

本文关键字:实体 更新 NHibernate 元素 添加 | 更新日期: 2023-09-27 18:18:59

我有一个包含注释列表的条目,如下面的映射文件所示。

我的场景:

  1. 我为一个给定的条目添加一个新的评论(如SaveComment方法中所见),并提交更改
  2. 之后我查询条目域对象上的评论,但我的新评论尚未添加

nhibernate是否使用了过期的缓存数据?我怎么解决这个问题?

using (ITransaction transaction = Session.BeginTransaction())
{
    try
    {
        Entry entry = Session.Load<Entry>(message.EntryId);
        Comment comment = SaveComment(entry, new BroadcastMetadata { some data });
        transaction.Commit();
        // I access the entry.LatestBroadcast info here 
        // but my entry doesnt have the new comment assigned yet !
        var latestData = entry.LatestBroadcast; // is null
    }
}
private Comment SaveComment(Entry entry, BroadcastMetadata broadcastMetadata)
{
    Session.Save(broadcastMetadata);
    var comment = new Comment
    {
        Entry = entry
        OldBroadcastData = entry.LatestBroadcast,
        NewBroadcastData = broadcastMetadata
    };
    Session.Save(comment);
    return comment;
}

My c# classes:

public class Entry
{
    public virtual BroadcastMetadata LatestBroadcast
    {
        get
        {
            BroadcastMetadata latestBroadcast = null;
            Comment broadcastComment = Comments.LastOrDefault();
            if (broadcastComment != null)
            {
                latestBroadcast = broadcastComment.NewBroadcastData;
            }
            else
            {
                latestBroadcast = BroadcastData;
            }
            return latestBroadcast;
        }
    }
    public virtual IList<Comment> Comments { get; protected set; }
}

我的映射:

<class name="Entry" table="`LogbookEntry`">
  <bag name="Comments" table="LogbookComment" lazy="false" inverse="true">
     <key column="EntryId" />
     <one-to-many 
       class="LogbookService.Core.Model.Comment, LogbookService.Core" />
  </bag>

<class name="Comment" table="LogbookComment">
  <many-to-one name="Entry" column="EntryId" fetch="join" lazy="false" cascade="none"
      class="LogbookService.Core.Model.Entry, LogbookService.Core" />
</class>

添加子元素后,NHibernate实体没有更新

关键是,using {}语句中的c#代码没有将Comment分配给Entry。在这种情况下,NHibernate只负责将所有的更改发布到DB中。

其他文字:

  • Comment将被保留
  • 它将包含对Entry的引用(EntryId列将包含正确的值)
  • 一旦Entry被加载,它将包含引用Comment

所以,NHibernate可以正常工作。

但是,在代码片段中,我们使用的是c#代码,它不受持久性更改的影响。所以我们必须显式地将Comment添加到Entry集合中。只是一个纯c#实体处理:

var comment = new Comment
{
    Entry = entry
    ...
};
entry.Comments.Add(comment)

注意:你正在关闭懒惰的settings,我猜你有很好的理由。但我至少会扩展包映射批:<bag name="Comments" ... batch-size="25">。点击这里阅读更多。使用批量抓取

需要注意的一点是,你正在请求事务作用域中的最后一个注释,这意味着NHibernate还没有处理事务,并且可能仍然在获取缓存数据,尽管它已经提交了。试试这个:

using (ITransaction transaction = Session.BeginTransaction())
     {
        try
        {
           Entry entry = Session.Load<Entry>(message.EntryId);
           Comment comment = SaveComment(entry, new BroadcastMetadata { some data });
           transaction.Commit();
        }
     }
     // i access the entry.LatestBroadcast info here but my entry doesnt have the new comment assigned yet !
     var latestData = entry.LatestBroadcast; // is null

如果这不起作用。尝试在提交事务后执行 session . flush ()来刷新会话。希望这对你有帮助!