0

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

  • Foo: 父表
  • Bar: 相关表1
    • Foo.BarIDBar表的外键约束
  • Crunch: 子表 2

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

  • 酒吧记录:Bar.FieldA,Bar.FieldB
  • 第一次紧缩记录:Crunch.FieldCCrunch.FieldD
  • 第二次紧缩记录:Crunch.FieldCCrunch.FieldD

我可以通过 将这些 HTML 表单输入值映射到BarCrunchFoo/Save,还是需要调用Foo/SaveBar/SaveCrunch/Save(两次)?

4

1 回答 1

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 知道的任何相关表中。这包括:

  • 外键(用于带有属性标记的 C#ForeignKey属性)
  • 子项(用于带有属性标记的 C#Child属性)
  • 子类(在类中配置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作为Fooin的子类Foo.config

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

由于子类暗示 1:many 关系,集合(由 实现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通过反射实例化集合,并在编译时知道数据类型。

于 2018-06-22T14:13:05.703 回答