How to: Use XPO Upcasting in XAF 如何:在 XAF 中使用 XPO 强制转换
In this topic, you will learn how to use the Upcasting feature of XPO in XAF. It is useful when you need to combine base and derived classes in a single query.
在本主题中,您将学习如何在 XAF 中使用 XPO 的转换功能。当您需要在单个查询中合并基类和派生类时,它很有用。
Tip 提示
Upcasting is not supported in Mobile applications.
移动应用程序不支持向上转换。
The following business model will be implemented to demonstrate the UpCasting.
将实现以下业务模型来演示 UpCasting。
The code below describes the persistent class hierarchy:
下面的代码描述了持久性类层次结构:
[DefaultClassOptions] [System.ComponentModel.DefaultProperty(nameof(Title))] public class Department : BaseObject { private string title; private string office; public Department(Session session) : base(session) {} public string Title { get {return title;} set { SetPropertyValue(nameof(Title), ref title, value); } } public string Office { get {return office;} set { SetPropertyValue(nameof(Office), ref office, value); } } [Association("Department-Employees")] public XPCollection<EmployeeBase> Employees { get {return GetCollection<EmployeeBase>(nameof(Employees));} } } public class EmployeeBase : BaseObject { public EmployeeBase(Session session) : base(session) {} private string name; private string email; public string Name { get {return name;} set { SetPropertyValue(nameof(Name), ref name, value); } } public string Email { get {return email;} set { SetPropertyValue(nameof(Email), ref email, value); } } private Department department; [Association("Department-Employees")] public Department Department { get {return department;} set { SetPropertyValue(nameof(Department), ref department, value); } } } [DefaultClassOptions] public class LocalEmployee : EmployeeBase { public LocalEmployee(Session session): base(session) {} private string insurancePolicyNumber; public string InsurancePolicyNumber { get {return insurancePolicyNumber;} set { SetPropertyValue(nameof(InsurancePolicyNumber), ref insurancePolicyNumber, value); } } } [DefaultClassOptions] public class ForeignEmployee : EmployeeBase { public ForeignEmployee(Session session): base(session) {} private DateTime visaExpirationDate; public DateTime VisaExpirationDate { get {return visaExpirationDate;} set { SetPropertyValue(nameof(VisaExpirationDate), ref visaExpirationDate, value); } } }
In the code above, the Department, LocalEmployee and ForeignEmployee classes use the DefaultClassOptions attribute. To learn more, refer to the Data Annotations in Data Model topic.
在上面的代码中,部门、本地员工和外籍员工类使用默认类选项属性。要了解更多信息,请参阅数据模型中的数据注释主题。
Now, run the application (whether the Windows Forms or ASP.NET Web application). Invoke a Department Detail View:
现在,运行该应用程序(无论是 Windows 窗体还是ASP.NET Web 应用程序)。调用部门详细信息视图:
The nested Employees List View displays the properties of the EmployeeBase class only. This behavior is by design. However, it is better to display Employee class descendant specific properties in the Employees List View. With the UpCasting feature, this is accomplished with ease.
嵌套员工列表视图仅显示员工基础类的属性。此行为是设计使然。但是,最好在"员工列表"视图中显示员工类后代特定属性。使用"向上转换"功能,可以轻松完成。
To add required columns to the List View that represents the Department.Employees collection, invoke the Model Editor. Locate the Views | Department_Employees_ListView | Columns node. Add two additional child nodes via the context menu. Specify their PropertyName property by the following values:
- <LocalEmployee>InsurancePolicyNumber
- <ForeignEmployee>VisaExpirationDate
要将所需列添加到表示部门.员工集合的列表视图,请调用模型编辑器。查找视图 |Department_Employees_ListView |列节点。通过上下文菜单添加两个额外的子节点。按以下值指定其属性名属性:
- <LocalEmployee>保险单编号
- <ForeignEmployee>签证过期日期
These values will be recognized by XPO, and the LocalEmployee.InsurancePolicyNumber and ForeignEmployee.VisaExpirationDate properties will be displayed for objects retrieved from the database to the Department.Employees collection.
这些值将由 XPO 和本地员工.保险政策编号和外国雇员.Visa过期日期属性显示从数据库检索到部门的对象。
In addition, set the "Insurance Policy Number" and "Visa Expiration Date" values to the Caption property of the newly added columns.
此外,将"保险单编号"和"签证到期日期"值设置为新添加列的"标题"属性。
Run the application and invoke the Department Detail View once again:
运行应用程序并再次调用部门详细信息视图:
You can see that the properties of the EmployeeBase class descendants are displayed together with the EmployeeBase class properties.
您可以看到,EmployerBase 类后代的属性与 EmployerBase 类属性一起显示。
XAF开发成品案例参考
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
作者博客: http://www.cnblogs.com/foreachlife
欢迎加入CIIP框架\XAF技术应用交流群: 336090194 群文件中有更多相关工具及文档资料
转载请注明出处。多谢!
欢迎加我微信: admiralcn 或扫码: