QBO3保存相关记录

时间:2018-06-22 14:13:06

标签: forms foreign-keys relationship

我有一个自定义的QBO3页面,该页面呈现来自多个表的自定义表的数据:

  • <build> <extensions> <extension> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-extension</artifactId> <version>${version}</version> </extension> </extensions> </build> :父表
  • <plugin>:相关表1
    • FooBar表的外键约束
  • Foo.BarID:子表2

我的Bar页面呈现了我所有的Foo列,以及:

  • 条形记录:CrunchFoo/Summary
  • 第一个关键记录:Bar.FieldABar.FieldB
  • 第二个紧缩记录:Crunch.FieldCCrunch.FieldD

II可以通过Crunch.FieldC将这些HTML表单输入值映射到Crunch.FieldDBar表,还是我需要调用CrunchFoo/Save,和Foo/Save(两次)?

1 个答案:

答案 0 :(得分:0)

是;将以下参数发布到Foo / Save:

Foo.ashx/Save?ID=X
  &Bar_FieldA=BA
  &Bar_FieldB=BB
  &Crunches_0_FieldC=CC1
  &Crunches_0_FieldD=CD1
  &Crunches_1_FieldC=CC2
  &Crunches_1_FieldD=CD2

QBO的AbstractObject/Save方法支持将数据持久保存到QBO3知道的任何相关表中。这包括:

  • 外键(用于带有ForeignKey属性标记的C#属性)
  • 孩子(对于带有Child属性标记的C#属性)
  • 子类(在ObjectConfiguration中为该类配置)

调用Foo/Save时,AbstractObject/SetProperties将:

检查外键参数

AbstractObject将遍历每个已定义的外键(包括Foo.BarID),如果存在以{ForeignKey}(减去ID)开头的参数,请设置外键对象的属性。如果Foo.BarID是在Foo.Fields.cs中沿这些行定义的,那么它将起作用:

[ForeignKey(typeof(my.Namespace.BarObject), "Bar")]
public Int64 BarID {...}

检查子类属性的集合

AbstractObject将循环遍历每个已配置的子类,如果存在以ChildClass.Name开头的参数,请创建子对象的集合并在该集合上设置属性。为此,您必须:

Crunches中将Foo作为Foo.config的子类:

<ChildClasses>
  <Child Name="Crunches" Type="my.Namespace.CrunchObject, my.Namespace"/>
</ChildClasses>

由于子类隐含1:1:1的关系,因此该集合(由AbstractCollection<T>实现)期望每个Crunch记录共享一个基于0的公共前缀。

注意:配置驱动的子类的替代方法是使用以下模式创建名为Crunches的C#属性:

[Child(typeof(CrunchObject)), XmlIgnore] 
public CrunchCollection Crunches {...}

其中CrunchCollection源自AbstractCollection<CrunchObject>,并添加了已知类型:

[KnownType(typeof(CrunchCollection))]
[KnownType(typeof(CrunchObject))]
public class CrunchCollection : AbstractCollection<CrunchObject>
{...}

这允许AbstractObject在编译时知道数据类型的情况下通过反射实例化集合。