XAF框架下将持久化类映射到无键字段数据库视图的实现方法
XAF框架下将持久化类映射到无键字段数据库视图的实现方法
在使用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应用程序。
二、实现步骤
创建一个新的XAF解决方案并按照《如何:为现有数据表生成XPO业务类》主题中的步骤进行操作。不要忘记修改将应用程序连接到nwind.mbd数据库的连接字符串。
打开nwind.mbd数据库以查看它包含哪些视图(查询)。您可以使用Microsoft Office Access或任何其他MDB查看器应用程序。在此示例中,CustomerReports视图映射到CustomerReports持久类:
注意:
此视图包含ProductName、CompanyName、OrderDate和ProductAmount字段。这些名称在实现CustomerReports类时使用。
- 创建一个新的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 {
// ...
}
- 运行应用程序。“客户报告”对象可用。
您可以在报告V2和分析中使用CustomerReports类作为数据类型: