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

DevExpress XAF多对多关系中间表主键OID自定义名称方法咨询

修改XAF多对多中间表主键OID的自定义名称方法

你说的这个需求我太熟了——XAF默认给多对多中间表自动生成的主键叫OID,确实有时候不符合咱们数据库的命名规范。要改成自定义名称,核心就是放弃系统自动生成中间表,手动创建一个专属的中间表实体类,这样就能完全掌控所有字段的命名了,具体步骤如下:

1. 创建自定义中间表实体类

首先新建一个继承自你项目基类(比如XPObject或BaseObject)的中间表类,比如针对你的KomutTanim和Makine关系,命名为MakineKomutTanim。在这个类里,我们自己定义主键(比如叫MakineKomutId),再定义两个关联原实体的外键属性:

public class MakineKomutTanim : XPObject
{
    // 自定义主键名称,替换默认的OID
    [Key(true)] // true表示自动生成Guid值,和原OID逻辑一致
    public Guid MakineKomutId { get; set; }

    // 关联Makine实体
    private Makine _makine;
    [Association("Makine-MakineKomutTanim"), XafDisplayName("Makine")]
    public Makine Makine
    {
        get { return _makine; }
        set { SetPropertyValue(nameof(Makine), ref _makine, value); }
    }

    // 关联KomutTanim实体
    private KomutTanim _komutTanim;
    [Association("KomutTanim-MakineKomutTanim"), XafDisplayName("Komut Tanımı")]
    public KomutTanim KomutTanim
    {
        get { return _komutTanim; }
        set { SetPropertyValue(nameof(KomutTanim), ref _komutTanim, value); }
    }

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

2. 修改原实体类的关联配置

接下来要把原来Makine和KomutTanim类里直接关联彼此的代码,改成关联咱们刚创建的中间表:

修改Makine类的代码:

[Association("Makine-MakineKomutTanim"), XafDisplayName("Makine Komutları")]
public XPCollection<MakineKomutTanim> MakineKomutlari
{
    get { return GetCollection<MakineKomutTanim>(nameof(MakineKomutlari)); }
}

// 如果需要直接获取关联的KomutTanim集合,可以加一个只读属性
[XafDisplayName("Komutlar")]
public XPCollection<KomutTanim> Komutlar
{
    get
    {
        return new XPCollection<KomutTanim>(Session, CriteriaOperator.Parse("[MakineKomutlari.Makine.Oid] = ?", Oid));
    }
}

修改KomutTanim类的代码:

[Association("KomutTanim-MakineKomutTanim"), XafDisplayName("Makineler")]
public XPCollection<MakineKomutTanim> KomutMakineListesi
{
    get { return GetCollection<MakineKomutTanim>(nameof(KomutMakineListesi)); }
}

// 同样可以加只读属性直接获取关联的Makine集合
[XafDisplayName("Makineler")]
public XPCollection<Makine> MasterId
{
    get
    {
        return new XPCollection<Makine>(Session, CriteriaOperator.Parse("[MakineKomutlari.KomutTanim.Oid] = ?", Oid));
    }
}

3. 关键注意事项

  • 一定要去掉原来代码里的UseAssociationNameAsIntermediateTableName = true参数,现在咱们用的是手动定义的中间表,不需要这个自动生成逻辑了
  • 如果是已经上线的项目,要注意数据库迁移:先备份原自动生成的中间表数据,然后删除自动生成的表,再创建新的自定义中间表,最后把数据迁移过去
  • 自定义主键的类型要和原OID保持一致(默认是Guid),这样不会影响原有逻辑的兼容性

内容的提问来源于stack exchange,提问作者Serdin Çelik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:37:29