我有一个条目,其中包含一个注释列表,如下面的映射文件所示。
我的情景:
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>
答案 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()提交事务后刷新会话。希望这有帮助!