Attach Files to Objects 将文件附加到对象
In this lesson, you will learn how to attach file collections to business objects. For this purpose, the File Attachment module will be added to the application, and the new Resume and PortfolioFileData business classes will be implemented. The Resume class will be used to store and manage a Contact's resume information: a file data collection and a reference to a Contact. The PortfolioFileData class will represent the file data collection item. You will also learn how the file data type properties are displayed and managed in a UI.
在本课中,您将学习如何将文件集合附加到业务对象。为此,文件附件模块将添加到应用程序中,并将实现新的"简历"和"项目组合文件数据"业务类。"简历"类将用于存储和管理联系人的简历信息:文件数据收集和对联系人的引用。包件文件数据类将表示文件数据收集项。您还将了解如何在 UI 中显示和管理文件数据类型属性。
Note 注意
Before proceeding, take a moment to review the following lessons.
在继续之前,请花点时间复习以下课程。
- Implement Custom Business Classes and Reference Properties (XPO/EF)
- Inherit from the Business Class Library Class (XPO/EF)
- Set a One-to-Many Relationship (XPO/EF)
实现自定义业务类和参考属性 (XPO/EF)
从商务舱库类 (XPO/EF) 继承
设置一对多关系 (XPO/EF)
- Add the File Attachments module to your WinForms module project. For this purpose, find the WinModule.cs (WinModule.vb) file in the MySolution.Module.Win project displayed in the Solution Explorer. Double-click this file to invoke the Module Designer. In the Toolbox, expand the DX.19.2: XAF Modules tab. Drag the FileAttachmentsWindowsFormsModule item to the Designer's Required Modules section.
将文件附件模块添加到 WinForms 模块项目中。为此,在 MySolution.module.win 项目中查找WinModule.cs (WinModule.vb) 文件。双击此文件以调用模块设计器。在工具箱中,展开 DX.19.2:XAF 模块选项卡。将文件附件 WindowsForms 模块项目拖动到"设计器所需的模块"部分。
Add the File Attachments module to your ASP.NET module project. For this purpose, find the WebModule.cs (WebModule.vb) file in the MySolution.Module.Web project displayed in the Solution Explorer. Double-click this file to invoke the Module Designer. In the Toolbox, expand the DX.19.2: XAF Modules tab. Drag the FileAttachmentsAspNetModule item to the Designer's Required Modules section.
将文件附件模块添加到ASP.NET模块项目中。为此,在解决方案资源管理器中显示的 MySolution.module.Web 项目中查找WebModule.cs (WebModule.vb) 文件。双击此文件以调用模块设计器。在工具箱中,展开 DX.19.2:XAF 模块选项卡。将文件附件AspNet模块项目拖动到"设计器所需的模块"部分。
- After you have made changes in the Application Designer, rebuild your solution.
- 在应用程序设计器中进行更改后,请重新生成解决方案。
- Add a new Resume business class, as described in the Inherit from the Business Class Library Class (XPO/EF) lesson.
- 添加新的"简历"业务类,如"从业务类库类继承"一课 (XPO/EF) 中所述。
Replace the automatically generated Resume class declaration with the following code.
将自动生成的 Resume 类声明替换为以下代码。
eXpress Persistent Objects
eXpress 持久对象
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl;
using DevExpress.Xpo;
using MySolution.Module.BusinessObjects; [DefaultClassOptions]
[ImageName("BO_Resume")]
public class Resume : BaseObject {
public Resume(Session session) : base(session) {}
private Contact contact;
public Contact Contact {
get {
return contact;
}
set {
SetPropertyValue(nameof(Contact), ref contact, value);
}
}
[Aggregated, Association("Resume-PortfolioFileData")]
public XPCollection<PortfolioFileData> Portfolio {
get { return GetCollection<PortfolioFileData>(nameof(Portfolio)); }
}
}
Entity Framework
实体框架
using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using DevExpress.Persistent.Base; namespace MySolution.Module.BusinessObjects {
[DefaultClassOptions]
[ImageName("BO_Resume")]
public class Resume {
public Resume() {
Portfolio = new List<PortfolioFileData>();
}
[Browsable(false)]
public Int32 ID { get; protected set; }
public virtual IList<PortfolioFileData> Portfolio { get; set; }
public virtual Contact Contact { get; set; }
}
}
public class MySolutionDbContext : DbContext {
//...
public DbSet<Resume> Resumes { get; set; }
}
public class Contact : Person {
public Contact() {
//...
Resumes = new List<Resume>();
}
//...
public virtual IList<Resume> Resumes { get; set; }
}
Declare the PortfolioFileData class, which is the FileAttachmentBase descendant for XPO and FileAttachment - for EF, and DocumentType enumeration (for XPO) as follows.
声明组合文件数据类,这是 XPO 和文件附件的 File 附件Base 子级 - 用于 EF,文档类型枚举(对于 XPO),如下所示。
eXpress Persistent Objects
eXpress 持久对象
public class PortfolioFileData : FileAttachmentBase {
public PortfolioFileData(Session session) : base(session) {}
protected Resume resume;
[Persistent, Association("Resume-PortfolioFileData")]
public Resume Resume {
get { return resume; }
set {
SetPropertyValue(nameof(Resume), ref resume, value);
}
}
public override void AfterConstruction() {
base.AfterConstruction();
documentType = DocumentType.Unknown;
}
private DocumentType documentType;
public DocumentType DocumentType {
get { return documentType; }
set { SetPropertyValue(nameof(DocumentType), ref documentType, value); }
}
}
public enum DocumentType { SourceCode = , Tests = , Documentation = ,
Diagrams = , ScreenShots = , Unknown = };
Entity Framework
实体框架
using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl.EF; namespace MySolution.Module.BusinessObjects {
[ImageName("BO_FileAttachment")]
public class PortfolioFileData : FileAttachment {
public PortfolioFileData()
: base() {
DocumentType = DocumentType.Unknown;
} [Browsable(false)]
public Int32 DocumentType_Int { get; protected set; }
[System.ComponentModel.DataAnnotations.Required]
public Resume Resume { get; set; } [NotMapped]
public DocumentType DocumentType {
get { return (DocumentType)DocumentType_Int; }
set { DocumentType_Int = (Int32)value; }
}
}
}
public class MySolutionDbContext : DbContext {
//...
public DbSet<PortfolioFileData> PortfolioFileData { get; set; }
public DbSet<FileAttachment> FileAttachments { get; set; }
}
In the code above, you can see that the Resume and PortfolioFileData classes are related with a One-to-Many relationship. Another important point is that in XPO, the PortfolioFileData.DocumentType property is initialized in the AfterConstruction method, which is called after creating the corresponding object.
在上面的代码中,您可以看到"简历"和"项目组合文件数据"类与一对多关系相关。另一个重要点是,在 XPO 中,在创建相应对象后调用的 After 构造方法中初始化了项目组合文件Data.DocumentType 属性。
The EF version of code includes a workaround of one noticeable Entity Framework peculiarity. By default, the deletion of a master-object does not cause the deletion of referenced objects. The only thing that happens is the nullification of the links from referenced objects to the master object. Nullification will be successful only if the referenced objects are loaded at the moment of deletion, but if an object is deleted from the List View, this is not always so. To avoid integrity violation, the associations between classes should be configured to allow the referenced objects to be deleted with the master. In the code above, this is done by the [System.ComponentModel.DataAnnotations.Required] attribute of the Resume property in the PortfolioFileData class declaration.
代码的 EF 版本包含一个值得注意的实体框架特性的解决方法。默认情况下,删除主对象不会导致删除引用的对象。唯一发生的情况是从引用对象到主对象的链接无效。仅当在删除时加载引用的对象时,取消将成功,但如果从列表视图中删除对象,则并不总是如此。为了避免完整性冲突,应将类之间的关联配置为允许与主对象一起删除引用的对象。在上面的代码中,这是由[System.组件模型.DataAnnotations.必需] 属性的"简历"属性在组合文件数据类声明中完成的。
Note 注意
Another way to avoid the integrity violation is the use of Fluent APIto call the WillCascadeOnDelete(true) method for the Portfolio-Resume relationship. The Fluent API requests should be located in the DbContext.
避免完整性冲突的另一种方法是使用 Fluent APIto 调用 WillCascadeOnDelete(true) 方法进行项目组合-恢复关系。流畅 API 请求应位于 DbContext 中。
Refer to the File Attachment Properties in XPO and File Attachment Properties in Entity Framework topics to learn more about file attachment properties creation.
请参阅 XPO 中的文件附件属性和实体框架中的文件附件属性主题,了解有关文件附件属性创建的详细信息。
- Run the WinForms or ASP.NET application and create a new Resume object.
To specify the File property, attach a file in the Open dialog, invoked via the Add From File... () button.
运行 WinForms 或ASP.NET应用程序并创建新的"简历"对象。
要指定 File 属性,请在"打开"对话框中附加一个文件,该对话框通过"从文件添加..."调用。(btn_attach)按钮。
To open or save a file attached to the Portfolio collection, or add a new file, use the Open..., Save As... or Add From File... Actions supplied with the collection.
要打开或保存附加到项目组合集合的文件,或添加新文件,请使用"打开...",另存为...或从文件添加...随集合一起提供的操作。
Tip 指示
To save the file stored within the current FileData object to the specified stream, use the IFileData.SaveToStream method.
要将存储在当前 FileData 对象中的文件保存到指定的流中,请使用 IFileData.SaveToStream 方法。
You can see the code demonstrated here in the Resume.cs (Resume.vb) file of the Main Demo installed with XAF. The MainDemo application is installed in %PUBLIC%\Documents\DevExpress Demos 19.2\Components\eXpressApp Framework\MainDemo by default. The ASP.NET version is available online at http://demos.devexpress.com/XAF/MainDemo/
您可以在随 XAF 安装的主演示的Resume.cs (Resume.vb) 文件中演示的代码。主演示应用程序安装在%PUBLIC%\Documents\DevExpress Demos 19.2\Components\eXpressApp Framework\MainDemo by default. The ASP.NET version is available online at http://demos.devexpress.com/XAF/MainDemo/
.
Attach Files to Objects 将文件附加到对象的更多相关文章
- SqlServer将没有log文件的数据库文件附加到服务器中
今天搞了一件很让我不爽的事情,一不小心把一个40多G的数据库日志文件删除,而且在删除之前我又搞了个日志进去,死活附加不了到服务器上去一直提示多个日志不能自动创建,白白浪费了我一个晚上的时间,后来不断的 ...
- Java NIO Path接口和Files类配合操作文件
Java NIO Path接口和Files类配合操作文件 @author ixenos Path接口 1.Path表示的是一个目录名序列,其后还可以跟着一个文件名,路径中第一个部件是根部件时就是绝对路 ...
- mac 使用清除废纸篓或彻底删除某文件 附加: smb afp ftp NAS 访问服务器相关
mac 使用清除废纸篓或彻底删除某文件 附加: smb afp ftp NAS 访问服务器相关 mac 下删除文件方法: 1.使用 cleanmymac 使用 cleamymac 的清理 和 逐个 ...
- 遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件
XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...
- Java对文件中的对象进行存取
1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...
- OpenCV C++ 计算文件夹中对象文件数目及批量处理后保存到txt文件
//采用windows控制台实现计算文件夹中对象总数以及批量读取对象 //#include <afx.h> //和windows.h是一样的作用 #include <opencv2/ ...
- 关于Android Assets读取文件为File对象
关于Android Assets读取文件为File对象的问题,在Assets里面放置文件,在使用的时候,一般是使用AssetManger对象,open方法获取InputStream 然后进行其他操作. ...
- Android开发之获取xml文件的输入流对象
介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...
- Java将对象保存到文件中/从文件中读取对象
1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...
随机推荐
- Spring Boot 最简单整合Shiro+JWT方式
简介 目前RESTful大多都采用JWT来做授权校验,在Spring Boot 中可以采用Shiro和JWT来做简单的权限以及认证验证,在和Spring Boot集成的过程中碰到了不少坑.便结合自身以 ...
- 常用torch代码片段合集
PyTorch常用代码段整理合集 本文代码基于 PyTorch 1.0 版本,需要用到以下包 import collections import os import shutil import tqd ...
- DevOps on DevCloud|如何实现应用接口的混合驱动测试
引言:在"DevOps能力之屋(Capabilities House of DevOps)"中,华为云DevCloud提出(工程方法+最佳实践+生态)×工具平台=DevOps能力. ...
- aplipay支付-app支付之前后端实现
目录 前言 一 前台aplipay实现 1.1 安装0x5e/react-native-alipay 1.2. 配置 1.3. Alipay.pay(orderStr) 二 后端 2.1 服务端sdk ...
- 基于python的种子搜索网站(三)项目部署
项目部署过程 系统要求:ubuntu 16.04(或以上) 环境搭建和配置,必须严格按照以下步骤来安装部署!如有问题可以咨询(weixin:java2048) 安装部分 安装nginx sudo ap ...
- Navicat for mysql 免费破解工具+教程
转载自:https://blog.csdn.net/BigCabbageFy/article/details/79789833 navicat for mysql带给大家这款高性能数据库管理开发工具的 ...
- kubernetes-单机实验(入门)
一.安装kubernetes 实验环境: centos7.0(建议使用7.5版本) 实验机器IP:192.168.1.4 安装方式:yum安装 需求环境:Tomcat+Mysql 1:关闭防火 ...
- Spring Boot 如何自定义返回错误码错误信息
说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...
- java8新特性- 默认方法 在接口中有具体的实现
案例分析 在java8中在对list循环的时候,我们可以使用forEach这个方法对list进行遍历,具体代码如下demo所示 public static void main(String[] arg ...
- Pycharm 解释器的快捷键
Ctrl+shift+Z 反撤销 Ctrl +/ 注释 ctrl+d 复制粘贴选中 Ctrl+y 删除默认一行 Ctrl+shift+r 全局搜索 Ctrl+alt+/ 代码整理 compare w ...