В моем домене я полностью занимаюсь несвязанными объектами с точки зрения NHibernate (версия 3.1).Соответственно, при отображении из моего основного домена в мой домен rdbms я вызываю Session.Merge
для сущностей rdbms, потому что граф содержит смесь постоянных и временных экземпляров - некоторые уже существуют, а некоторые являются новыми и нуждаются в добавлении в базу данных.
Допустим, у меня есть следующая модель (псевдо)
class Post
{
ISet<Comment> Comments { get; set; }
}
class Comment
{
Post Post { get; set; }
string UnimportantString { get; set; }
}
У меня есть экземпляр объекта для Post
, полученный из Session
, и новый (переходный) Comment
экземплярmyComment
, созданный в результате сопоставления из моей доменной модели.Я добавляю это к существующему Post
:
myComment.Post = myPost;
myPost.Comments.Add(myComment);
myPost = Session.Merge(myPost);
Предположим, что это в единицах работы.Вызывая Session.Merge
для myPost
, NHibernate по своему замыслу не изменяет существующие экземпляры в предоставленном графе, но возвращает различные экземпляры, которые либо были созданы, либо уже находились в кэше 1-го уровня.Таким образом, хотя возвращаемый myPost
теперь содержит постоянный экземпляр комментария, исходный экземпляр myComment
, на который ссылается мой код, не был изменен.
Я хочу отобразить измененные объекты обратно в мойосновной домен, но мне не хватает надежного способа выбрать измененный Comment
из объединенного myPost.Comments
.Я предполагаю, что myPost.Comments.Last()
не гарантированно будет тем, который я только что добавил.
Я хочу надежно сопоставить, какая запись во вновь объединенном наборе myPost.Comments
соответствует моему исходному экземпляру myComment
,например, чтобы я мог получить идентификатор в результате завершения транзакции.Я не могу сделать это по ID, потому что мой оригинальный myComment был новым объектом.Я не могу вызвать SaveOrUpdate на myComment, потому что это упрощенный пример гораздо более сложного графа - есть другие свойства и более глубокий граф, и я хочу иметь возможность надежно соотносить новые экземпляры NHibernate с исходными экземплярами, которые я ему предоставил.
Каков наилучший способ получения обновленного Comment
после Session.Merge(myPost)
, чтобы я мог сопоставить его с моей моделью основного домена?
ps К сожалению, просто изменить вызов на myComment = Session.Merge(myComment)
недостаточно, поскольку у меня есть и другие объекты, на которые я хочу сослаться после одного вызова на Merge
, а не только на этот Comment
в моем упрощенном примере
pps Этот надуманный пример скрывает этот факт, но я использую Session.Merge, потому что в процессе отображения из моего основного домена в мой домен rdbms я получаю граф, который может содержатьпостоянные, временные и / или грязные объекты