添加子元素后NHibernate实体未更新

时间:2013-06-19 14:55:19

标签: c# nhibernate

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

我的情景:

  1. 我为给定条目添加新注释(如SaveComment方法中所示)并提交更改
  2. 之后我查询了关于输入域对象的评论,但我的新评论尚未添加
  3. NHibnerate是否使用过时的缓存数据?我该如何解决这个问题?

    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;
    }
    

    我的C#课程:

    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>
    

2 个答案:

答案 0 :(得分:1)

关键是,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">。在此处阅读更多内容19.1.5. Using batch fetching

答案 1 :(得分:0)

需要注意的一点是,您正在请求事务范围内的最后一条注释,这意味着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()提交事务后刷新会话。希望这有帮助!