【问题标题】:Is there a way to Clone one or many Entities (records) in Code有没有办法在代码中克隆一个或多个实体(记录)
【发布时间】:2020-11-10 02:51:13
【问题描述】:

注意:此时我在这个项目上被困在 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);
    }

【问题讨论】:

  • 这仍然是个问题吗?我很乐意提供帮助,但已经离开 SO 一个月了,所以我不想把时间花在已经解决的问题上。
  • 是的,仍然打开,无法解决。尝试了许多不同的旋转和语法,但无法在不引发错误的情况下创建()。我仍然需要一种代码方法来克隆现有实体。并在创建之前或之后更新它。似乎 API 中的某个地方应该有一些简单的东西,但我找不到。

标签: c# dotnetnuke 2sxc


【解决方案1】:

至少有3种克隆方式

  1. 使用edit-ui的简单方法
  2. 很难使用 c#/server api
  3. 使用 REST api 的半硬方式

简单的方法是使用编辑 ui。您可以在替换对话框中看到一个示例,那里有一个复制按钮。这将使用现有项目打开编辑 UI,但告诉它它是一个副本,因此保存它会创建一个新项目。

将它与预填充或其他东西结合起来,我认为你会很高兴。

第二种方法是使用 App.Data.Create - 您的代码看起来相当不错。我认为它也有效,您只是想知道是否有 1-liner - 还是我弄错了?

最后一种方法是使用 JS REST。基本上写一些 JS 来获取一个项目,更改对象(重置 id)并将其发送回端点以保存。

【讨论】:

  • 它不能解决我的问题,但有很多选择,我可以让它们为客户工作。我的主要问题是 Create() 与实体和超链接字段类型。我要么得到空引用异常,要么复制的实体不完全相同。我看到你回答了一个关于超链接字段的类似问题,我会回顾一下,然后再考虑一下。你读过我的用例吗?我觉得你认为 UI 是一个可能的解决方案很奇怪。 ;)
  • 对于超链接字段,我猜你的问题是当你阅读它时,你得到的是链接而不是存储的“file:72”。我有两个建议:不升级:做AsEntity(original).GetBestValue&lt;string&gt;("name-of-link-field") 或升级(11.11)有一个关于动态实体original.Get("name-of-link-field", convertLinks: false) 的新命令另见docs.2sxc.org/api/dot-net/…
  • 终于回到了这个问题,因为客户希望很快再次添加新的季节。我确实让一切正常,我相信我将所有字段类型都复制到了正确的新数据中。但是,我是通过 attribute.Key 做所有事情......如果我可以获取实体的字段类型,我可以大大简化和重用它。所以我想要像if(AsEntity(original).FieldType == "HyperLink") { do this stuff} 这样的东西。我已经探索了 API 文档,但还没有发现如何获取信息。有可能吗?
【解决方案2】:

刚刚偶然发现我需要创建实体并设置其字段值的情况,该值具有另一个实体的类型。如果这是您的问题 #1,您需要在此处添加 EntityGuidfields.Add(attr.Key, attr.EntityGuid);。这应该将一个实体绑定到另一个实体。 不,我没有偶然发现复制实体的更好方法,然后只是创建一个新实体。至少到目前为止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2013-10-06
    • 2020-12-01
    • 1970-01-01
    • 2021-03-18
    • 2011-03-16
    相关资源
    最近更新 更多