Использование поля "По умолчанию" для объекта

Добрый день, коллеги!

Пытаюсь использовать поле IsDefault для собственного раздела "Размещения" (Store). Это поле должно принимать значение true только для одной записи из таблицы Store. Естественно возникает вопрос где такую функциональность можно реализовать.
На вскидку у меня 3-и варианта:
1. Триггеры на уровне ms sql server
2. События объекта
3. События карточки редактирования

1 пункт мне не нравится :). 3 пункт на мой взгляд не реализуем.
Остается п. 2.
При реализации функциональности у меня возникло множество проблемы :).

1. Не очень хорошо понимаю как работать с результатами коллекции GetEntityCollection(UserConnection). В частности непонятно как получить значение любого поля из каждого экземпляра в коллекции. В отладчике вот такой вариант почему-то в столбце "Value" выдает ошибку:

entitys[0].GetTypedColumnValueGuid>("Id")

2. Каким образом я могу сделать Update для конкретной записи с фильтром по полю Id?
Заодно хотелось бы увидеть примеры использования и операций Insert и Delete (на будущее).

3. Есть ощущение, что я создам бесконечный цикл, если в объекте для события обновления записи выполню код по обновлению записи для этого же объекта. Как быть в этом случае?

4. Работая с отладчиком серверного кода я не вижу методы объектов. С чем это связано и как можно их отобразить в том объеме в котором они есть в sdk.

5. Где я могу найти класс Entity? Судя по sdk GetEntity() возвращает объект именно этого типа/класс. В sdk такого класса в Terrasoft.Core.Entitys нету (по крайней мере в версии 7.5.0).

6. У меня что-то с браузером? Я использую хром и в ветке "Библиотека классов ядра платформы" у меня постоянно какие-то зависания при раскрытии структуры. Кроме этого, я не понимаю как пользоваться поиском. Результаты его запросов всегда выполняют редирект не на конкретную страничку, а на главную страничку sdk. Так же заметил 2-а неприятных эффекта. Во-первых, при раскрытии структуры sdk размер левой части не подбирается под содержим, что в отдельных случаях не позволяет видеть полное название класс, перечисления и прочих полезных "штучек". Во-вторых контент "прыгает" в буквальном смысле и при раскрытии структуры и очень часто возникает ситуация когда нужно мотать вверх и вниз для того чтобы определить свое местоположение.

Нравится

7 комментариев

Есть другое решение - создать системный параметр (System settings) DefaultStore, в который выбирать тот самый Store по умолчанию. Тогда не нужны проверки

Владимир, спасибо!

Очень помогли. Действительно перенос в системную переменную очень все упрощает.

Тем не менее все 6 вопросов актуальны.

1. После выполнения метода entitySchemaQuery.GetEntityCollection(UserConnection) формируется запрос к БД, возвращается коллекция объектов, которая содержит только те колонки, которые были заданы для entitySchemaQuery с помощью метода AddColumn(). Пример: entitySchemaQuery.AddColumn(entitySchema.PrimaryColumn.Name). Данный пример показывает, как добавить в запрос первичную колонку для entitySchema. Эквивалент - entitySchemaQuery.AddColumn("Id"), но запись entitySchema.PrimaryColumn.Name - корректней.

2.
Чтобы добавить запись, необходимо:
2.1 Получить менеджер

var entitySchemaManager = UserConnection.EntitySchemaManager;

2.2 Получить схему объекта

var entitySchema = entitySchemaManager.GetInstanceByName("Contact");

или

Guid entitySchemaUId = "0bff4bc9-1a80-42f8-aa43-628a031dc6c0";
var entitySchema = entitySchemaManager.GetInstanceByUId(entitySchemaUId);

2.3 Создать экзмепляр объекта

var entity = entitySchema.CreateEntity(UserConnection);

2.4 Заполнить колонки по умолчанию

entity.SetDefColumnValues();

2.5 Заполнить необходимые колонки (обычно это первичная колонка и первичная для отображения колонка)

entity.SetColumnValue(entitySchema.PrimaryColumn.Name, Guid.NewGuid());
entity.SetColumnValue(entitySchema.PrimaryDisplayColumn.Name, "New entity");

2.6 Вызвать сохранение записи

entity.Save();

Чтобы удалить запись, необходимо:
- Вызвать метод Delete()

entity.Delete();

Чтобы изменить запись, необходимо:
- Вызвать метод FetchFromDB()
Guid entityId = "0bff4bc9-1a80-42f8-aa43-628a031dc6c0";
entity.FetchFromDB(entityId);
- Если метод вернет true, то запись присутствует в БД и в entity запишиться вся информация из записи.

3. В таком случае нужно выполнить обновление только необходимых полей объекта.

4. Если Вы имеете ввиду отладчик в Visual Studio и серверный код в конфигурации, то причина в том, что такой серверный код является автогенерируемый и не входит не в один проект.

5. SDK находится в процессе разработки. Спасибо, что обратили внимание на отсутствия класса Entity. Он будет добавлен в ближайшее время.

6. SDK находится в процессе разработки и постоянно развивается поэтому могут возникнут сложности при работе.

Немного добавлю

"Березкин Геннадий" написал:В частности непонятно как получить значение любого поля из каждого экземпляра в коллекции.

  EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
    EntitySchemaQuery esq = new EntitySchemaQuery(schema);
    esq.AddAllSchemaColumns();
//Фильтр для таблицы
    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", "FilterName"));
    EntityCollection entities = esq.GetEntityCollection(UserConnection);
//перебираем все записи коллекции, полученной в запросе
    foreach (Entity entity in entities)
    {
        //установить значение
        entity.SetColumnValue("Name", "NewName");
        //получить значение колонки Name
        entity.GetTypedColumnValue<string>("Name");
        //Сохраняем, при необходимости
        entity.Save();
    }

Спасибо за помощь.

Я не совсем понял с

entity.FetchFromDB(entityId);

Save() и Delete() помечают, что запись подлежат либо обновлению, либо удалению соответственно? FetchFromDB(entityId) - это запуск соответствующего запроса?
И еще вопрос. Как в entitys добавить запись?

entity.FetchFromDB(entityId) Возвращает true, если запись с указанным Id найдена в БД. В entity приходит вся информация из записи БД. Если пришло false, значит запись с таким Id не найдена.

Save() - сразу сохраняет entity в БД.
Delete() - сразу удаляет entity из БД.

В общем случае запись добавляется по указанной EntitySchema. Чтобы добавить запись достаточно получить EntitySchema этого объекта. Затем необходимо создать entity.
var entity = entitySchema.CreateEntity(UserConnection);
Для entity вызвать метод Save.
entity.Save();

Если необходимо просто добавить экземпляр в коллекцию, то можно воспользоваться методом AddLast для entityCollection. В него передать entity

Спасибо за помощь. Разобрался!

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