问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

XAF框架下将持久化类映射到无键字段数据库视图的实现方法

创作时间:
作者:
@小白创作中心

XAF框架下将持久化类映射到无键字段数据库视图的实现方法

引用
CSDN
1.
https://m.blog.csdn.net/thomastang200912_126/article/details/142667747

在使用XAF框架开发应用程序时,有时需要将持久化类映射到数据库视图。如果数据库视图没有主键字段,应该如何处理呢?本文将详细介绍如何在XAF应用程序中实现这一功能,包括具体的步骤、代码示例和注意事项。

一、概述

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

本主题介绍如何实现映射到数据库视图的持久类而无需密钥。在本主题中,我们使用了DXperience Suite附带的“NorthWind Traders”演示数据库,并默认安装在%PUBLIC%\Documents\DevExpress Demos 24.1\Components\Data\nwind. mdb中。除了填充了演示数据的表之外,此数据库还包括多个数据库视图。

注意:
此方法使用复合键,这在ASP.NET Core Blazor应用程序中不支持,仅适用于WinForms和ASP.NET Web Forms应用程序。

二、实现步骤

  1. 创建一个新的XAF解决方案并按照《如何:为现有数据表生成XPO业务类》主题中的步骤进行操作。不要忘记修改将应用程序连接到nwind.mbd数据库的连接字符串。

  2. 打开nwind.mbd数据库以查看它包含哪些视图(查询)。您可以使用Microsoft Office Access或任何其他MDB查看器应用程序。在此示例中,CustomerReports视图映射到CustomerReports持久类:

注意:
此视图包含ProductName、CompanyName、OrderDate和ProductAmount字段。这些名称在实现CustomerReports类时使用。

  1. 创建一个新的CustomerReports持久类(您可以使用DevExpress 24.1 ORM持久对象模板)。将自动生成的类声明替换为以下代码:
using System;
using System.ComponentModel;
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]
    public CustomerReportsViewKey Key {
        get { return fKey; }
        set { SetPropertyValue(nameof(Key), ref fKey, value); }
    }
    [PersistentAlias("Key.ProductName")]
    public string ProductName { get { return Key.ProductName; } }
    [PersistentAlias("Key.CompanyName")]
    public string CompanyName { get { return Key.CompanyName; } }
    [PersistentAlias("Key.OrderDate")]
    public DateTime OrderDate { get { return Key.OrderDate; } }
    [PersistentAlias("Key.ProductAmount")]
    public string ProductAmount { get { return Key.ProductAmount; } }
}

[TypeConverter(typeof(StructTypeConverter<CustomerReportsViewKey>))]
public struct CustomerReportsViewKey {
    [Persistent("ProductName"), Browsable(false)]
    public string ProductName;
    [Persistent("CompanyName"), Browsable(false)]
    public string CompanyName;
    [Persistent("OrderDate"), Browsable(false)]
    public DateTime OrderDate;
    [Persistent("ProductAmount"), Browsable(false)]
    public string ProductAmount;
}

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

CustomerReportsViewKey结构定义构成复合键的列。该结构需要TypeConverter属性,这使ASPxGridView能够识别键值并处理对象。

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

注意:

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

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

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

您可以在报告V2和分析中使用CustomerReports类作为数据类型:


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号