假设我有以下型号:
class Post
{
ICollection<Comment> Comments { get; set; }
}
class Comment
{
Post Post { get; set;}
}
我有一个现有的post
,我在其中添加了新的comment
。由于某种原因(太长而无法进入),我在那时打电话给Session.Merge(post)
,但我还没有答应。然后,我清除post.Comments
,因为其他一些代码决定不需要它,并添加另一个新的Comment
。然后我再次致电Session.Merge(post)
。
我看到的行为是向数据库发出了两个INSERT,因为添加了两个注释(即使我清除了中间的集合)。但是对象实例并没有反映这一点;合并之后,post.Comments.Count为1.如果我调用Session.Clear()并按id重新加载帖子,我会看到两条真实反映数据库中发生的事情的评论。
问题是,它没有反映出我想要的东西。我只需要一个评论(在这个例子中)。
我相信这种情况正在发生,因为在已经合并到会话之后,我正在清除Comments
集合,然后在再次合并之前修改它,然后提交事务。因此会话的ActionQueue
已经为第一条评论列出了插入内容。 当我清除集合时,我原本希望将此操作从队列中删除,但事实并非如此。
为了确认这一点,我尝试发出一个Session.Delete(eachComment)
,然后调用post.Comments.Clear()
给我留下了预期的总共1条评论,但仍然发出了一个INSERT,紧接着是一个DELETE到数据库。
我可以让NHibernate的会话检测到一个集合在提交之前被清除并被替换了吗?