Вопрос

Изменение параметра в БД, используя его путь относительно корневой схемы

Добрый день! Столкнулся со следующей проблемой:

У меня есть путь относительно корневой схемы к параметру, который нужно изменить. Вида:

mainEntity.entityA.(...).entityN.lookupName

Мне нужно изменить значение справочника в последней присоединенной схеме.

Пробовал делать следующим образом:

                var esqMainEntity = new EntitySchemaQuery(userConnection.EntitySchemaManager, "mainEntity");

                esqMessage.AddColumn(actionEntityPath);

                var mainEntity = esqMessage.GetEntity(userConnection, mainId);

                mainEntity.SetColumnValue("mainEntity_entityA_(...)_entityN_lookupNameId", newValue);

                mainEntity.Save();

В данном случае SetColumnValue проходит, но возникает ошибка на методе Save(). Видимо, таким образом нельзя изменить значение в присоединенной таблице, а не в основной.

Пробовал обновить через update:

                    var update = new Update(userConnection, "mainEntity")

                    .Set("mainEntity.entityA.(...).entityN.lookupNameId", Column.Const(newValue))

                    .Where("Id").IsEqual(Column.Const(mainId));

                    update.Execute();

Тоже выдает ошибку (с конструкцией "mainEntity_entityA_(...)_entityN_lookupNameId" та же история).

Подскажите, пожалуйста, как мне быть. Ещё думал получить Id entityN и обновить уже этот объект, но название самого объекта может отличаться от его названия относительно корневой схемы, и это не дает мне выполнить update этого объекта.

Нравится

2 комментария

Если у вас есть путь к колонке, соответственно вы знаете в какой именно объект надо зафиксировать изменения. Поэтому не выдумывая никакие пути пишем

var manager = UserConnection.EntitySchemaManager.GetInstanceByName("Department"); //своё название конечного объекта вместо Department
var entity = manager.CreateEntity(UserConnection);
entity.FetchFromDB(depId); //id элемента/записи в бд
entity.SetColumnValue("Name", "Новый отдел"); //1 параметром идёт именно колонка из объекта. никаких путей. для лукапных колонок добавляется Id (например CreatedById)
entity.Save(false);

Также не рекомендую делать entity.Save через esq. А если и делать, то предварительно выбрать все колонки (esq.AddAllSchemaColumns). И опять же, без путей.

Update - это простой конструктор sql комманд и пути он не понимает от слова "совсем". Чтобы составить сложную конструкцию для select надо напихать кучу leftJoin.

Варфоломеев Данила,

Проблема в том, что объект, который называется Department, в пути может называться как угодно:

WwfTask.WwfClient.WwfDepartment

В этом случае колонка WwfDepartment является ссылкой на объект Department. То есть в таком случае мне необходимо узнать имя конечной схемы, которую нужно обновить. А я не знаю как это сделать, к своему глубокому сожалению.

Показать все комментарии