EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:在非持久性对象的视图中显示持久性对象

本主题描述如何在非持久性类中声明持久性类型引用集合属性,并在用户界面中显示它,以及(可选)为其分配默认值。

永久参考属性

考虑以下非持久类:

using DevExpress.ExpressApp.DC;
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl;
// ...
[DomainComponent, DefaultClassOptions]
public class NonPersistentObject {
    // ...
    public string Name { get; set; }
    public Person Owner { get; set; }
    // ...
}
注意

INotifyPropertyChanged的IXafEntityObjectIObjectSpaceLink接口实现在本实施例中被略去。但是,建议在实际应用程序中支持这些接口(请参阅业务类非持久对象中的PropertyChanged事件)。

提示

使用“如何:使用非持久对象执行CRUD操作”主题中演示的方法来支持从本地缓存中保存和加载非持久对象。

在此,Person业务类库中的持久类(对于Entity Framework或XPO)。请参阅从业务类库(EF)添加类或从业务类库(XPO)添加类,以了解如何从该库添加类。另外,您可以使用自定义业务类来代替Person

在此阶段,创建新的NonPersistentObject时调用的详细信息视图将显示Owner属性的查找编辑器。但是,查找为空,您不能选择任何现有的Person

PersistentInNonPresistent1

为当前View创建的NonPersistentObjectSpace无法处理Person持久对象。请按照以下步骤为该类型创建持久对象空间:

  1. 处理模块或控制器中的XafApplication.ObjectSpaceCreated事件。
  2. 在事件处理程序中,为Person类型创建一个附加的对象空间,然后将此对象空间添加到NonPersistentObjectSpace.AdditionalObjectSpaces集合中。

以下示例演示了如何在与平台无关的模块(MySolution.Module / Module.csvb))中执行此操作:

using DevExpress.ExpressApp;
//...
public class MySolutionModule : ModuleBase {
    private void Application_ObjectSpaceCreated(object sender, ObjectSpaceCreatedEventArgs e) {
        if(e.ObjectSpace is NonPersistentObjectSpace) {
            IObjectSpace additionalObjectSpace = Application.CreateObjectSpace(typeof(Person));
            ((NonPersistentObjectSpace)e.ObjectSpace).AdditionalObjectSpaces.Add(additionalObjectSpace);
            e.ObjectSpace.Disposed  = (s, args) => {
                additionalObjectSpace.Dispose();
            };
        }
    }
    public override void Setup(XafApplication application) {
        base.Setup(application);
        application.ObjectSpaceCreated  = Application_ObjectSpaceCreated;
    }
}

结果如下所示。

PersistentInNonPresistent2

永久收藏

您可以添加Owners集合,而不是Owner引用属性:

[DomainComponent, DefaultClassOptions]
public class NonPersistentObject{
    // ... 
    public string Name { get; set; }
    private IList<Person> owners = new List<Person>();
    public IList<Person> Owners {
        get {
            return owners;
        }
    }
}

用户可以添加和删除业主通过链接取消链接从添加代码后的操作一节

PersistentInNonPresistent_Collection

初始化持久属性值

在您的非持久类中实现IObjectSpaceLink接口,并使用IObjectSpace.GetObjects <T>方法获取所需的持久对象。

[DomainComponent, DefaultClassOptions]
public class NonPersistentObject : IObjectSpaceLink {
    public string Name { get; set; }
    private Person owner;
    public Person Owner {
        get {
            if (owner == null) {
                owner = ObjectSpace.GetObjects<Person>(CriteriaOperator.Parse("FirstName='Sam'")).FirstOrDefault();
            }
            return owner;
        }
        set { owner = value; }
    }
    private IList<Person> owners;
    public IList<Person> Owners {
        get {
            if (owners == null) {
                owners = ObjectSpace.GetObjects<Person>(CriteriaOperator.Parse("StartsWith(FirstName, 'B')")) ;
            }
            return owners;
        }
    }
    private IObjectSpace objectSpace;
    [Browsable(false)]
    public IObjectSpace ObjectSpace {
        get { return objectSpace; }
        set { objectSpace = value; }
    }
}

如果在UI中创建新的NonPersistentObject,则会初始化其Owner属性和Owner集合:

PersistentInNonPresistent_Init

重要笔记

如果您的非持久类包含持久属性并实现IObjectSpaceLink,请注意以下内容。

当从单独的NonPersistentObjectSpace加载这样的对象时,您会通过IObjectSpaceLink.ObjectSpace获得链接到初始对象空间的相同对象实例。如果不需要此行为,则可以在NonPersistentObjectSpace.ObjectsGetting事件处理程序中更新对象空间。修改“持久引用属性”部分中演示的MySolutionModule类,如下所示:

using DevExpress.ExpressApp;
//...
public class MySolutionNameModule : ModuleBase {
    private void Application_ObjectSpaceCreated(object sender, ObjectSpaceCreatedEventArgs e) {
        if(e.ObjectSpace is NonPersistentObjectSpace) {
            IObjectSpace additionalObjectSpace = Application.CreateObjectSpace(typeof(Person));
            ((NonPersistentObjectSpace)e.ObjectSpace).AdditionalObjectSpaces.Add(additionalObjectSpace);
            ((NonPersistentObjectSpace)e.ObjectSpace).ObjectGetting  = ObjectSpace_ObjectGetting;
            e.ObjectSpace.Disposed  = (s, args) => {
                ((NonPersistentObjectSpace)s).ObjectGetting -= ObjectSpace_ObjectGetting;
                additionalObjectSpace.Dispose();
            };
        }
    }
    private void ObjectSpace_ObjectGetting(object sender, ObjectGettingEventArgs e) {
        if(e.SourceObject is IObjectSpaceLink) {
            e.TargetObject = e.SourceObject;
            ((IObjectSpaceLink)e.TargetObject).ObjectSpace = (IObjectSpace)sender;
        }
    }
    public override void Setup(XafApplication application) {
        base.Setup(application);
        application.ObjectSpaceCreated  = Application_ObjectSpaceCreated;
    }
}

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