Подскажите пожалуйста, как можно восстановить прошлую версию версионируемой сущности (удалить текущую, и восстановить прошлую, причем метод должен работать с типом, приходящим в качестве параметра, не 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 - тут проблем нет.