EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:实现自定义基本持久性类

XAF附带了业务类库,其中包含许多可在您的应用程序中使用的持久性类。所有这些类均源自在同一库中声明的BaseObject基础持久性类。这是推荐使用的功能丰富的持久类。但是,在某些情况下,它可能无法满足您的要求。在这种情况下,您可以使用XPO提供的基本持久性类之一来实现自定义类。本主题描述了实现自定义基本持久类所需执行的步骤,以确保其在整个eXpressApp Framework中均按预期运行。如果您不需要实现自定义类并想使用XPO提供的基类之一,请参考基持久性类。 而是帮助主题。

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E1255)中提供了完整的示例项目。

尽管可以从头开始实现自定义基类持久性类,但最好通过从XPO提供的基类之一派生现有功能来重用现有功能。在此示例中,我们将从XPCustomObject派生自定义基类。XPCustomObject类支持延迟删除和乐观并发控制,但不提供自动生成的主键属性。

实施自动生成​​的主键属性

如果您派生的基类没有自动生成的键属性,则需要手动实现。我们不建议为新数据库实现复合键或复合键。虽然在某些情况下可以为具有复合键的旧数据库设计持久类,但总是最好修改数据库架构以避免这种情况,因为使用复合键对默认功能施加了一些限制。请参阅如何使用复合键为数据库表创建持久对象。知识库文章以了解更多信息。以下代码段说明了一个带有Key属性的GUID属性,该属性指定XPO应该自动生成其值。请注意,XPO仅通过Int32和GUID类型的Key属性支持自动生成键属性值。

using System;
using System.ComponentModel;
using DevExpress.Xpo;
using DevExpress.Xpo.Metadata;
using DevExpress.ExpressApp;
//...
[NonPersistent]
public abstract class BasePersistentObject : XPCustomObject {
    public BasePersistentObject(Session session) : base(session) { }
    [Persistent("Oid"), Key(true), Browsable(false), MemberDesignTimeVisibility(false)]
    private Guid _Oid = Guid.Empty;
    [PersistentAlias(nameof(_Oid)), Browsable(false)]
    public Guid Oid { get { return _Oid; } }
    protected override void OnSaving() {
        base.OnSaving();
        if (!(Session is NestedUnitOfWork) && Session.IsNewObject(this))
            _Oid = XpoDefault.NewGuid();
    }
}

持久化该类没有多大意义,因为它包含单个属性(对于自动生成的主键),因此该类被标记为非持久性。结果,将在与该类后代相对应的数据库表中创建主键列。这样可以消除XPO生成的SQL查询中的多余JOIN语句,从而提高数据库性能。此外,您应该以演示的方式重写OnSaving方法,以支持正确保存从类派生的新对象,并在特定情况下通过嵌套的工作单元创建新对象。

实现ToString方法

要完成自定义基本持久类的实现,请重写其ToString方法以管理默认属性。默认属性显示在“查找属性编辑器”中,并参与表单标题的生成。此外,它们由FullTextSearch操作自动使用,并首先显示在列表视图中。在实现自定义基本持久类时,重写ToString方法以检查DefaultProperty属性是否应用于该类并返回其值。

[NonPersistent]
public abstract class BasePersistentObject : XPCustomObject {
    //...
    private bool isDefaultPropertyAttributeInit;
    private XPMemberInfo defaultPropertyMemberInfo;    
    public override string ToString() {
        if (!isDefaultPropertyAttributeInit) {
            DefaultPropertyAttribute attrib = XafTypesInfo.Instance.FindTypeInfo(
                GetType()).FindAttribute<DefaultPropertyAttribute>();
            if (attrib != null)
                defaultPropertyMemberInfo = ClassInfo.FindMember(attrib.Name);
            isDefaultPropertyAttributeInit = true;
        }
        if (defaultPropertyMemberInfo != null) {
            object obj = defaultPropertyMemberInfo.GetValue(this);
            if (obj != null)
                return obj.ToString();
        }
        return base.ToString();
    }
}

转载保留此链接,注明出处