有没有办法在代码中克隆一个或多个实体(记录)
Is there a way to Clone one or many Entities (records) in Code
注意:此时我在这个项目上卡在 2sxc v9.43.2 上。
从我的内容类型中选择一组记录后,我需要能够复制它们,同时更改其中的一个字段。到目前为止,这是我几乎可行的想法。用例很简单,他们有人们可以注册的程序。他们每个季节都会改变,但只会改变一点点(价格,dates/times,等等)。他们需要在编辑下一季时保持当前季不变。所以我们仍处于秋季 (EntityId 1732),有 97 个活动程序。我们想单击一个按钮并按原样克隆所有 97 个程序,但要进入新的下一季(下方 1735 个)。
两个问题:
- 如果这种方式可行,ent/Attributes 需要什么语法才能在
fields.Add()
行 中交付所需的“对象”
- 还有其他 2sxc 方法可以做到这一点吗? App.Data.Create() 方法的其他变体或 API 中的其他方法?我只需要复制 1 个字段(季节)已更改的记录?
- 在最新版本的 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 个问题,您需要在此处添加 EntityGuid
。
fields.Add(attr.Key, attr.EntityGuid);
。这应该将一个实体绑定到另一个实体。
不,我并没有偶然发现更好的方法来复制实体然后只是为了创建一个新实体。至少到目前为止。
至少有3种克隆方式
- 使用编辑的简单方法-ui
- 很难使用 c#/服务器 api
- 使用 REST 的半困难方法 api
简单的方法是使用编辑ui。您可以在替换对话框中看到一个示例,那里有一个复制按钮。这将打开带有现有项目的编辑 UI,但告诉它它是一个副本,因此在保存时它会创建一个新的。
将它与预填充物或其他东西结合起来,我想你会很高兴。
第二种方法是使用 App.Data.Create - 您的代码看起来相当不错。我假设它也有效,你只是想知道是否有 1 线 - 还是我弄错了?
最后一种方式是使用 JS REST。基本上写一些获取项目的 JS,更改对象(重置 id)并将其发送回端点以进行保存。
注意:此时我在这个项目上卡在 2sxc v9.43.2 上。
从我的内容类型中选择一组记录后,我需要能够复制它们,同时更改其中的一个字段。到目前为止,这是我几乎可行的想法。用例很简单,他们有人们可以注册的程序。他们每个季节都会改变,但只会改变一点点(价格,dates/times,等等)。他们需要在编辑下一季时保持当前季不变。所以我们仍处于秋季 (EntityId 1732),有 97 个活动程序。我们想单击一个按钮并按原样克隆所有 97 个程序,但要进入新的下一季(下方 1735 个)。
两个问题:
- 如果这种方式可行,ent/Attributes 需要什么语法才能在
fields.Add()
行 中交付所需的“对象”
- 还有其他 2sxc 方法可以做到这一点吗? App.Data.Create() 方法的其他变体或 API 中的其他方法?我只需要复制 1 个字段(季节)已更改的记录?
- 在最新版本的 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 个问题,您需要在此处添加 EntityGuid
。
fields.Add(attr.Key, attr.EntityGuid);
。这应该将一个实体绑定到另一个实体。
不,我并没有偶然发现更好的方法来复制实体然后只是为了创建一个新实体。至少到目前为止。
至少有3种克隆方式
- 使用编辑的简单方法-ui
- 很难使用 c#/服务器 api
- 使用 REST 的半困难方法 api
简单的方法是使用编辑ui。您可以在替换对话框中看到一个示例,那里有一个复制按钮。这将打开带有现有项目的编辑 UI,但告诉它它是一个副本,因此在保存时它会创建一个新的。
将它与预填充物或其他东西结合起来,我想你会很高兴。
第二种方法是使用 App.Data.Create - 您的代码看起来相当不错。我假设它也有效,你只是想知道是否有 1 线 - 还是我弄错了?
最后一种方式是使用 JS REST。基本上写一些获取项目的 JS,更改对象(重置 id)并将其发送回端点以进行保存。