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
相关产品推荐
相关产品推荐

