EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

将文件附加到对象

在本课程中,您将学习如何将文件集合附加到业务对象。为此,将文件附件模块添加到应用程序中,并将实现新的ResumePortfolioFileData业务类。该简历类将被用于存储和管理联系人的简历信息:文件中的数据收集和一个参考联系。该PortfolioFileData类将代表文件的数据收集项目。您还将学习如何在UI中显示和管理文件数据类型属性。

注意

在继续之前,请花一点时间回顾以下课程。

  • 实施自定义业务类和参考属性XPO / EF
  • 继承自业务类库类XPO / EF
  • 设置一对多关系XPO / EF
  • 文件附件模块添加到您的WinForms模块项目中。为此,请在“解决方案资源管理器”中显示的MySolution.Module.Win项目中找到WinModule.csWinModule.vb)文件。双击该文件以调用模块设计器。在“工具箱”中,展开DX。19.2:“ XAF模块”选项卡。将FileAttachmentsWindowsFormsModule项拖到设计器的“必需的模块”部分。

    Tutorial_EM_Lesson1_0

  • 文件附件模块添加到您的ASP.NET模块项目中。为此,请在解决方案资源管理器中显示的MySolution.Module.Web项目中找到WebModule.csWebModule.vb)文件。双击该文件以调用模块设计器。在“工具箱”中,展开DX。19.2:“ XAF模块”选项卡。将FileAttachmentsAspNetModule项目拖到设计器的“必需的模块”部分。

    Tutorial_EM_Lesson1_0_1

  • Application Designer中进行更改后,重新构建解决方案。
  • 按照从业务类库类继承(XPO / EF)课程中的描述,添加新的Resume业务类。
  • 用以下代码替换自动生成的Resume类声明。

    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)); }
      }
    }
    

    实体框架

    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; }
    }
    

    声明PortfolioFileData类,这是FileAttachmentBase后代为XPO和FileAttachment的-为EF,和DocumentType枚举(为XPO)如下。

    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 = 1, Tests = 2, Documentation = 3,
       Diagrams = 4, ScreenShots = 5, Unknown = 6 };
    

    实体框架

    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; }
    }
    

    在上面的代码中,您可以看到ResumePortfolioFileData类与一对多关系相关。另一个重要的一点是,在XPO中,在AfterConstruction方法中初始化了PortfolioFileDataData.DocumentType属性,该方法在创建相应的对象之后被调用。

    EF版本的代码包括一个明显的Entity Framework特性的变通办法。默认情况下,删除主对象不会导致引用对象的删除。唯一发生的是从引用对象到主对象的链接无效。仅当在删除时加载了引用的对象时,空化才会成功,但是如果从“列表视图”中删除了对象,则并非总是如此。为避免完整性冲突,应将类之间的关联配置为允许所引用的对象与主对象一起删除。在上面的代码中,这是通过“恢复”属性中的[System.ComponentModel.DataAnnotations.Required]属性完成的。PortfolioFileData类声明。

    注意

    避免完整性违规的另一种方法是使用Fluent API调用Portfolio-Resume关系的WillCascadeOnDelete(true)方法。Fluent API请求应位于DbContext中。

    请参阅在XPO文件附件属性文件附件属性在实体框架主题以了解更多有关文件附件属性创建。

  • 运行WinForms或ASP.NET应用程序并创建一个新的Resume对象。
  • 要指定File属性,请在“打开”对话框中附加一个文件,该文件通过“从文件添加...”btn_attach)按钮调用。

    Tutorial_EM_Lesson1_1

  • 要打开或保存附加到Portfolio集合的文件,或添加新文件,请使用集合随附的Open ...另存为...Add From File ...操作。

    Tutorial_EM_Lesson1_3

提示

要将存储在当前FileData对象中的文件保存到指定的流,请使用IFileData.SaveToStream方法。

您可以在随XAF一起安装的Main Demo的Resume.csResume.vb)文件中看到此处演示的代码。该MainDemo应用程序安装在%PUBLIC%\文件\ DevExpress的演示19.2 \组件\ eXpressApp框架\ MainDemo默认。可从http://demos.devexpress.com/XAF/MainDemo/在线获得ASP.NET版本。

下一课: 为最终用户提供几种视图变体

相关文章

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