添加子元素后,NHibernate实体没有更新
本文关键字:实体 更新 NHibernate 元素 添加 | 更新日期: 2023-09-27 18:18:59
我有一个包含注释列表的条目,如下面的映射文件所示。
我的场景:
- 我为一个给定的条目添加一个新的评论(如SaveComment方法中所见),并提交更改
- 之后我查询条目域对象上的评论,但我的新评论尚未添加
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>
关键是,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 ()来刷新会话。希望这对你有帮助!