Восстановление прошлой версии версионируемой сущности

Подскажите пожалуйста, как можно восстановить прошлую версию версионируемой сущности (удалить текущую, и восстановить прошлую, причем метод должен работать с типом, приходящим в качестве параметра, не generic)?
В теории видится всё просто - получить все записи по versionMetaId (вопрос как это сделать? метод IQueryable IDataStore.GetAll(Type entityType) возвращает IQueryable, который нужно материализовать (неприемлемо без условий - записей слишком много), чтобы привести к типу, а затем накинуть условия на выборку (что-то типа этого: .Where(x => ((IVersioningManagementEntity)x).VersionMetaId == changeRecord.ChangedEntityId))), исключить из них ту что вернется из обычного GetAsync (т.к. он работает с вью [tableName]_actual_versions), упорядочить по VersionActualPeriodEnd (OrderByDescending),
взять первую запись, проставить у нее .VersionActualPeriodEnd = DateTime.MaxValue, и удалить действующую запись (тут сработает констрейнт, и не даст этого сделать - еще один вопрос - как его обойти?).
Пробовал писать что-то типа такого

  StringBuilder sqlBuilder = new StringBuilder();
                sqlBuilder.AppendFormat("select * from {0} where version_meta_id = {1}", tableName, changeRecord.ChangedEntityId);
                var data = await _sessionProvider
                    .GetCurrentSession()
                    .CreateSQLQuery(sqlBuilder.ToString())
                    .SetResultTransformer(new AliasToBeanResultTransformer(mainEntityTypeManagement))
                    .ListAsync();

Но тут тоже беда - NHibernate.PropertyNotFoundException: ‘Could not find a setter for property ‘object_create_date’ in class ‘Bars.Aispd.ResultsVersioningManagement’’, а если не приводить к mainEntityTypeManagement (строка .SetResultTransformer(new AliasToBeanResultTransformer(mainEntityTypeManagement))), то в результате будут объекты-массивы объектов, из которых ничего не собрать.

Может есть какой-то более простой способ всё это провернуть?

Тип получаю так:

        var changeRecord = changesBatch.First().ChangeRecord;
        var changedEntityDescriptor = rootEntityDescriptor.GetChildEntityDescriptor(changeRecord.ChangedEntityTypeUid);
        var changedEntityProperties = changedEntityDescriptor.GetProperties();
        var mainEntityType = changedEntityDescriptor.EntityType;
        var changedEntity = await dataStore.GetAsync(mainEntityType, changeRecord.ChangedEntityId);
  var mainEntityTypeManagement = Type.GetType($"{mainEntityType.FullName}VersioningManagement, {mainEntityType.Assembly.FullName}");

, т.е работаю с [entityName]VersioningManagement - тут проблем нет.

Пришлось обойти таким образом:

в начале метода:


var session = Container.Resolve().GetCurrentSession();
using (var tx = _interceptedDataStore.BeginTransaction())
{
try
{
await session.CreateSQLQuery(@“set constraints all deferred”).ExecuteUpdateAsync();
// откладываем контроль констрейнтов в базе на момент коммита транзакции


var nhibernateConfig = _container.Resolve<NHibernate.Cfg.Configuration>();
var dialect = Dialect.GetDialect(nhibernateConfig.Properties);
var _sessionProvider = _container.Resolve();
var mainEntityTypeManagement = Type.GetType($"{mainEntityType.FullName}VersioningManagement, {mainEntityType.Assembly.FullName}");
if (mainEntityTypeManagement != null)
{
NHibernate.Mapping.PersistentClass entPc = nhibernateConfig.GetClassMapping(mainEntityType.FullName);
var tableName = ToTableName(dialect, entPc.TableClosureIterator.Single().Name);

                StringBuilder sqlBuilder = new StringBuilder();
                sqlBuilder.AppendFormat(@"
                                            delete from public.{0}
                                              where version_meta_id = {1} and version_actual_period_end > now();

                                            update public.{0}
                                              set version_actual_period_end = 'infinity'
                                              where id = (select id
                                                    from public.{0}
                                                    where version_meta_id = {1} and version_actual_period_end < now()
                                                    order by version_actual_period_end desc
                                                    limit 1);                                              
                                                ", tableName, changeRecord.ChangedEntityId);
                var data = _sessionProvider
                    .GetCurrentSession()
                    .CreateSQLQuery(sqlBuilder.ToString())
                    .ExecuteUpdate();