You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XAF中在一个业务对象内创建多个业务对象?

如何在XAF中在一个业务对象内创建多个业务对象?

看起来你是想在XAF里实现一对多的业务对象关联——也就是一个Fiche(生产单)对应多个关联的子项(你说的那些要共享同一个Fiche的Item),而且要通过MAINPRODREF字段关联到父Fiche的主键LOGICALREF对吧?结合你给出的需求和现有代码,我来给你梳理下具体实现步骤:

1. 定义子业务对象(关联的Item)

首先你需要创建一个子业务对象(比如叫ProductionItem),用来存储那些和Fiche关联的条目。这个对象需要包含两个关键部分:

  • 关联父Fiche主键的MAINPRODREF字段
  • 指向父Fiche对象的导航属性(方便XAF识别关联关系)

示例代码如下:

public class ProductionItem : BaseObject // 继承XAF的基类,比如BaseObject或XPObject
{
    int fMAINPRODREF;
    public int MAINPRODREF
    {
        get { return fMAINPRODREF; }
        set { SetPropertyValue<int>(nameof(MAINPRODREF), ref fMAINPRODREF, value); }
    }

    // 导航属性,关联到父Fiche对象
    Fiche fFiche;
    [Association("Fiche-ProductionItems")] // 关联名称要和父对象的集合属性对应
    public Fiche Fiche
    {
        get { return fFiche; }
        set { SetPropertyValue<Fiche>(nameof(Fiche), ref fFiche, value); }
    }

    // 其他你需要的属性,比如子项自己的标识、名称等
    int fItemRef;
    [Key(true)]
    public int ItemRef
    {
        get { return fItemRef; }
        set { SetPropertyValue<int>(nameof(ItemRef), ref fItemRef, value); }
    }
}

2. 修改父Fiche对象,添加子项集合属性

接下来要在你现有的Fiche类里,添加一个子对象的集合属性,这样在XAF界面里就能直接管理和创建关联的子项了。结合你给出的现有代码,补充后的Fiche类示例:

public class Fiche : BaseObject
{
    int fLOGICALREF;
    [Key(true)]
    public int LOGICALREF
    {
        get { return fLOGICALREF; }
        set { SetPropertyValue<int>(nameof(LOGICALREF), ref fLOGICALREF, value); }
    }

    string fNAME;
    [Indexed(Name = @"I124_BOMASTER_I3aa")]
    [Size(51)]
    [XafDisplayName("İsim")]
    public string NAME
    {
        get { return fNAME; }
        set { SetPropertyValue<string>(nameof(NAME), ref fNAME, value); }
    }

    // 添加子项集合,和子对象的Association名称对应
    [Association("Fiche-ProductionItems")]
    [XafDisplayName("关联生产条目")]
    public XPCollection<ProductionItem> ProductionItems
    {
        get { return GetCollection<ProductionItem>(nameof(ProductionItems)); }
    }
}

3. 自动关联主键(可选但实用)

为了符合你提到的“只能将多个Item的ID附加到Fiches”的规则,你可以添加自动赋值逻辑,让子项创建时自动把MAINPRODREF设置为父Fiche的LOGICALREF。比如在子对象的构造函数里处理:

public ProductionItem(Session session) : base(session) { }

protected override void OnSaving()
{
    base.OnSaving();
    // 如果父Fiche存在,自动同步MAINPRODREF
    if (Fiche != null && MAINPRODREF != Fiche.LOGICALREF)
    {
        MAINPRODREF = Fiche.LOGICALREF;
    }
}

4. 界面端的配置

做完以上代码修改后,记得在XAF的模块设计器里:

  • 把ProductionItem对象添加到模块的业务对象列表中
  • 为Fiche对象的ProductionItems集合配置合适的编辑器(比如列表编辑器),这样在Fiche的详情页就能直接添加、编辑关联的子项了

这样设置后,你就能实现需求中的效果:一个Fiche对应多个关联的Item,每个Item的MAINPRODREF和父Fiche的LOGICALREF保持一致,完全符合你给出的示例表格结构。

备注:内容来源于stack exchange,提问作者user14491987

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:53:13