Допустим, у меня есть следующая модель:
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, после которого сразу же УДАЛЕНО в базу данных.
Могу ли я получить сеанс NHibernate, чтобы обнаружить, что коллекция была очищена и заменена до ее фиксации?