EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:将持久类映射到没有键字段的数据库视图

使用XAF,您可以从头开始构建新应用程序或维护现有数据库。“如何:为现有数据表生成XPO业务类”主题描述了如何使用设计时向导同时为指定数据库中的一个或多个数据表生成业务类。另外,现有数据库可以包含视图(存储的查询),需要在XAF应用程序的“列表视图”,“分析”和“报告”中进行访问。如果数据库视图具有键列,则可以使用与映射到常规表相同的方法将持久性类映射到它。

本主题描述如何实现没有键的映射到数据库视图的持久类。在本主题中,我们默认使用DXperience Suite随附的“ Northwind Traders”演示数据库,该数据库默认安装在%PUBLIC%\ Documents \ DevExpress Demos 19.2 \ Components \ Data \ nwind.mdb中。除了装有演示数据的表之外,该数据库还包括几个数据库视图。

注意

此方法使用移动应用程序中不支持的复合键,并且仅适用于WinForms和ASP.NET应用程序。

  1. 创建一个新的XAF解决方案,并按照“如何:为现有数据表生成XPO业务类”主题中的步骤进行操作。不要忘记修改将应用程序连接到nwind.mbd数据库的连接字符串。
  2. 打开nwind.mbd数据库以查看其包含的视图(查询)。您可以使用Microsoft Office Access或任何其他MDB查看器应用程序。在此示例中,CustomerReports视图映射到CustomerReports持久类:

    MapDatabaseView_1

    注意

    该视图包含ProductNameCompanyNameOrderDateProductAmount字段。这些名称在实现CustomerReports类时使用。

  3. 创建一个新的CustomerReports持久类(您可以使用DevExpress 19.2 ORM持久对象模板)。用以下代码替换自动生成的类声明:

    using DevExpress.ExpressApp.Xpo.Utils;
    using DevExpress.Persistent.Base;
    using DevExpress.Xpo;
    // ...
    [DefaultClassOptions]
    public class CustomerReports : XPLiteObject {
        public CustomerReports(Session session) : base(session) { }
        CustomerReportsViewKey fKey;
        [Key, Persistent, Browsable(false)]
        public CustomerReportsViewKey Key {
            get { return fKey; }
            set { SetPropertyValue(nameof(Key), ref fKey, value); }
        }
        public string ProductName { get { return Key.ProductName; } }
        public string CompanyName { get { return Key.CompanyName; } }
        public DateTime OrderDate { get { return Key.OrderDate; } }
        public string ProductAmount { get { return Key.ProductAmount; } }
    }
    [TypeConverter(typeof(StructTypeConverter<CustomerReportsViewKey>))]
    public struct CustomerReportsViewKey {
        string fProductName;
        [Persistent("ProductName"), Browsable(false)]
        public string ProductName {
            get { return fProductName; }
            set { SetPropertyValue(nameof(ProductName), ref fProductName, value); }
        }
        string fCompanyName;
        [Persistent("CompanyName"), Browsable(false)]
        public string CompanyName {
            get { return fCompanyName; }
            set { SetPropertyValue(nameof(CompanyName), ref fCompanyName, value); }
        }
        DateTime fOrderDate;
        [Persistent("OrderDate"), Browsable(false)]
        public DateTime OrderDate {
            get { return fOrderDate; }
            set { SetPropertyValue(nameof(OrderDate), ref fOrderDate, value); }
        }
        string fProductAmount;
        [Persistent("ProductAmount"), Browsable(false)]
        public string ProductAmount {
            get { return fProductAmount; }
            set { SetPropertyValue(nameof(ProductAmount), ref fProductAmount, value); }
        }
    }
    

    每个持久类都需要一个主键。该CustomerReports类是XPLiteObject类的后裔,它没有自动生成的关键属性。因此,实现了表示复合键(通过组合至少两个或更多列形成的键)的Key属性。

    所述CustomerReportsViewKey结构限定了形成复合键列。该结构需要TypeConverter属性,该属性使ASPxGridView能够识别键值并处理对象。

    此外,CustomerReports类公开与所有视图的列相对应的属性。您可以省略任何属性,但是复合键仍应包括所有列。

    注意
    • 数据库视图可以已经有一个键列。在这种情况下,您不需要组合键,而应使用KeyAttribute装饰键属性。
    • 复合键中包含的列数是有限的。例如,Microsoft SQL Server最多允许16列。

    如果您不希望类与数据库视图具有相同的名称,则可以使用自定义名称,并用PersistentAttribute装饰类:

    [DefaultClassOptions, Persistent("CustomerReports")]
    public class MyCustomerReports : XPLiteObject {
        // ...
    }
    
  4. 运行应用程序。“客户报告”对象可用。

    MapDatabaseView_2

    您可以将CustomerReports类用作Reports V2Analysis中的数据类型:

    MapDatabaseView_3

相关文章

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