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

#c# #dotnetnuke #2sxc

#c# #dotnetnuke #2sxc

Вопрос:

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

После выбора набора записей из моего типа контента мне нужно иметь возможность дублировать их, изменяя 1 из полей по пути. Вот моя почти рабочая идея на данный момент. Вариант использования прост, у них есть программы, для которых люди могут зарегистрироваться. Они меняются каждый сезон, но лишь немного (цены, даты / время и т. Д.). И им нужен текущий сезон в реальном времени и без изменений, пока они редактируют следующий сезон. Итак, мы все еще находимся в осеннем сезоне (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);
    }
  

Комментарии:

1. Это все еще проблема? Я хотел бы помочь, но уже месяц отсутствовал в SO, поэтому я не хочу тратить время на проблемы, которые уже закрыты.

2. Да, все еще открыт, не может быть разрешен. Пробовал много разных вращений и синтаксиса, но не смог создать () без выдачи ошибки. Мне все еще нужен способ в коде клонировать существующую сущность. И обновлять его перед его созданием или после обновления. Похоже, что где-то в API должно быть что-то простое, но я не могу его найти.

Ответ №1:

Существует как минимум 3 способа клонирования

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

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

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

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

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

Комментарии:

1. Это не решает мою проблему, но есть много вариантов, и я могу заставить их работать на клиента. Моя основная проблема связана с Create() с типами полей сущностей и гиперссылок. Я либо получаю исключения с нулевыми ссылками, либо скопированный объект не совсем тот же. Я видел, что вы ответили на аналогичный вопрос о полях гиперссылок, я рассмотрю это и подумаю об этом еще раз. Вы читали мой пример использования? Мне кажется странным, что вы считаете пользовательский интерфейс возможным решением. 😉

2. Для полей гиперссылок, я думаю, ваша проблема в том, что когда вы ее читаете, вы получаете ссылку вместо сохраненного «file: 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 /…

3. наконец, возвращаясь к этому, поскольку клиент ожидает скорого добавления новых сезонов. Я все заработал, я считаю, что у меня все типы полей, копирующие свои данные, соответствуют новым. Тем не менее, я делаю все по attribute.Key … Я мог бы значительно упростить и повторно использовать это, если бы вместо этого мог получить тип поля объекта. Итак, я хочу что-то вроде if(AsEntity(original).FieldType == "HyperLink") { do this stuff} . Я изучил документы API, но не обнаружил, как добраться до информации. Возможно ли это?

Ответ №2:

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