Есть ли способ клонировать одну или несколько сущностей (записей) в коде

ПРИМЕЧАНИЕ: в настоящее время я застрял на 2sxc v9.43.2 в этом проекте.

После выбора набора записей из моего типа контента мне нужно иметь возможность дублировать их, изменяя при этом одно из полей. Вот моя пока что почти рабочая идея. Сценарий использования прост, у них есть программы, для которых люди могут зарегистрироваться. Они меняются каждый сезон, но лишь немного (цены, даты / время и т. Д.). И им нужен текущий сезон в прямом эфире и без изменений, пока они редактируют следующий сезон. Итак, мы все еще находимся в осеннем сезоне (EntityId 1732) с 97 активными программами. Мы хотим нажать кнопку и клонировать все 97 программ как есть, но В ДОСТУПЕ к новому следующему сезону (1735 ниже).

Два вопроса:

  1. если этот способ работает, какой синтаксис будет работать с ent / Attributes для доставки объекта по мере необходимости в строке fields.Add()
  2. есть ли другой способ 2sxc сделать это? Другой вариант метода App.Data.Create () или какой-то другой метод в API? Мне просто нужно продублировать запись с измененным 1 полем (Сезон)?
  3. есть ли лучший способ сделать это в последних версиях 2sxc, v11.7 +?
    // we are going to duplicate the current Season's programs in to the new season
    // cheating for now, pre-made new 1735 in Seasons, current is 1732
    var programs = AsDynamic(App.Data["Programs"])
      .Where(p => ((List<DynamicEntity>)p.Season).First().EntityId == selectedSeason.EntityId);
    // @programs.Count() // 97
    foreach(var copy in programs)
    {
      var fields = new Dictionary<string, object>();
      var ent = AsEntity(copy);
      foreach(var attr in ent.Attributes)
      {
        if(attr.Key == "Season")
        {
          fields.Add(attr.Key, new List<int> { 1735 });
        }
        else
        {
          fields.Add(attr.Key, ent.GetBestValue(attr.Key));   // object??
        }
      }
      App.Data.Create("Programs", fields);
    }

person Jeremy Farrance    schedule 10.11.2020    source источник
comment
Это все еще проблема? Я был бы рад помочь, но был вдали от SO в течение месяца, поэтому я не хочу тратить время на вопросы, которые уже закрыты.   -  person iJungleBoy    schedule 06.12.2020
comment
Да, все еще открыто, решить не удалось. Пробовал много разных спинов и синтаксиса, но не смог создать () без выдачи ошибки. Мне все еще нужен способ клонирования существующей сущности в коде. И обновите его перед созданием или после обновления. Похоже, где-то в API должно быть что-то простое, но я не могу этого найти.   -  person Jeremy Farrance    schedule 06.12.2020


Ответы (2)


Есть как минимум 3 способа клонирования

  1. Простой способ с помощью edit-ui
  2. жесткий способ с использованием c # / server api
  3. Полутвердый способ с использованием REST api

Самый простой способ - использовать интерфейс редактирования. Вы можете увидеть пример в диалоге замены, там есть кнопка копирования. Это откроет пользовательский интерфейс редактирования с существующим элементом, но сообщит ему, что это копия, поэтому при сохранении он создаст новый.

Объедините это с предварительным заполнением или чем-то еще, и я думаю, вам будет хорошо.

Второй способ - использовать App.Data.Create - ваш код выглядит неплохо. Я предполагаю, что это тоже работает, и вам просто интересно, был ли однострочный - или я ошибаюсь?

Последний способ - использовать JS REST. В основном напишите какой-нибудь JS, который получает элемент, изменяет объект (сбрасывает идентификатор) и отправляет его обратно в конечную точку для сохранения.

person iJungleBoy    schedule 07.12.2020
comment
Это не решает мою проблему, но вариантов много, и я могу заставить их работать на клиента. Моя основная проблема связана с Create () с типами полей сущностей и гиперссылок. Я либо получаю исключения с нулевой ссылкой, либо скопированный объект не совсем то же самое. Я видел, как вы ответили на аналогичный вопрос о полях гиперссылок, я рассмотрю это и еще раз подумаю. Вы читали мой пример использования? Мне кажется странным, что вы думаете, что пользовательский интерфейс - возможное решение. ;) - person Jeremy Farrance; 07.12.2020
comment
Что касается полей гиперссылок, я думаю, ваша проблема в том, что когда вы ее читаете, вы получаете ссылку вместо сохраненного файла: 72. У меня есть два предложения: без обновления: сделать AsEntity(original).GetBestValue<string>("name-of-link-field") или с обновлением (11.11) есть новая команда для динамического объекта original.Get("name-of-link-field", convertLinks: false) см. Также docs.2sxc.org/api/dot-net/ - person iJungleBoy; 09.12.2020
comment
наконец, вернемся к этому, поскольку клиент ожидает, что скоро снова добавят новые сезоны. У меня все заработало, я считаю, что у меня есть все типы полей, копирующие в своих данных, правильные для нового. Однако я все делаю по атрибуту. Ключ ... Я мог бы значительно упростить и использовать повторно, если бы вместо этого мог получить тип поля сущности. Так что я хочу что-то вроде if(AsEntity(original).FieldType == "HyperLink") { do this stuff}. Я изучил документацию API, но не понял, как получить информацию. Является ли это возможным? - person Jeremy Farrance; 07.04.2021

Просто наткнулся на ситуацию, когда мне нужно было создать сущность и установить для нее значение поля, которое имеет тип другой сущности. Если это ваш вопрос №1, вам нужно добавить туда EntityGuid. fields.Add(attr.Key, attr.EntityGuid);. Это должно связать одну сущность с другой. И нет, я не нашел лучшего способа скопировать сущность, чем просто создать новую. По крайней мере, пока.

person Constantine Ketskalo    schedule 01.12.2020