EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

定义数据模型并设置初始数据

本主题描述如何为WinForms和ASP.NET应用程序定义业务模型和业务逻辑。应用程序的业务模型包含两个逻辑部分,这些逻辑部分通过不同的ORM工具实现:

逻辑部分 ORM工具 班级
营销 实体框架(EF) 客户感言
规划 eXpress持久对象(XPO) 项目任务

添加客户和推荐实体(EF)

  1. 解决方案资源管理器中,右键单击SimpleProjectManager.Module \ BusinessObjects文件夹,然后选择“添加” |“添加”。类别''。将名称设置为“市场营销”,然后点击添加

  2. 用以下代码替换自动生成的文件内容:

    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Runtime.CompilerServices;
    using DevExpress.ExpressApp.DC;
    using DevExpress.Persistent.Base;
    
    namespace SimpleProjectManager.Module.BusinessObjects.Marketing {
        [NavigationItem("Marketing")]
        public class Customer : INotifyPropertyChanged {
            public Customer() {
                testimonials = new List<Testimonial>();
            }
            int id;
            [Browsable(false)]
            public int Id {
                get { return id; }
                protected set { SetProperty(ref id, value); }
            }
            string firstName;
            public string FirstName {
                get { return firstName; }
                set { SetProperty(ref firstName, value); }
            }
            string lastName;
            public string LastName {
                get { return lastName; }
                set { SetProperty(ref lastName, value); }
            }
            string email;
            public string Email {
                get { return email; }
                set { SetProperty(ref email, value); }
            }
            string company;
            public string Company {
                get { return company; }
                set { SetProperty(ref company, value); }
            }
            string occupation;
            public string Occupation {
                get { return occupation; }
                set { SetProperty(ref occupation, value); }
            }
            List<Testimonial> testimonials;
            [Aggregated]
            public virtual List<Testimonial> Testimonials {
                get { return testimonials; }
                set { SetProperty(ref testimonials, value); }
            }
            [NotMapped]
            public string FullName {
                get {
                    string namePart = string.Format("{0} {1}", FirstName, LastName);
                    return Company != null ? string.Format("{0} ({1})", namePart, Company) : namePart;
                }
            }
            byte[] photo;
            [ImageEditor(ListViewImageEditorCustomHeight = 75, DetailViewImageEditorFixedHeight = 150)]
            public byte[] Photo {
                get { return photo; }
                set { SetProperty(ref photo, value); }
            }
            protected void SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = null) {
                if (!EqualityComparer<T>.Default.Equals(field, value)) {
                    field = value;
                    OnPropertyChanged(propertyName);
                }
            }
        #region the INotifyPropertyChanged members
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propertyName) {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        #endregion
        }
    }
    
    显示API说明
  3. 打开SimpleProjectManager.Module \ BusinessObjects文件夹中的SimpleProjectManagerDbContext.csSimpleProjectManagerDbContext.vb)文件。将Customer和Testimonial属性添加到SimpleProjectManagerDbContext类中,以在DbContext中注册Customer和Testimonial实体,如下所示:

    using SimpleProjectManager.Module.BusinessObjects.Marketing;
    
    namespace  SimpleProjectManager.Module.BusinessObjects {
        public class SimpleProjectManagerDbContext : DbContext {
            //... 
            public DbSet<Customer> Customer { get; set; }
            public DbSet<Testimonial> Testimonial { get; set; }
        }
    }
    
  4. 解决方案资源管理器中,导航到Module.csModule.vb)文件,然后按F7键在代码编辑器中打开该文件。取消注释#if#endif指令以及它们之间的代码,如下所示,以指定EF的数据库初始化程序。使用此未注释的代码,每次更改实体时都将重新创建数据库。

    public sealed partial class SimpleProjectManagerModule : ModuleBase {
        static SimpleProjectManagerModule() {
            // ...
            // Uncomment this code to delete and recreate the database each time the data model has changed.
            // Do not use this code in a production environment to avoid data loss.
    #if DEBUG
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SimpleProjectManagerDbContext>());
    #endif
        }
        // ...
    }
    

添加Project和ProjectTask持久类(XPO)

  1. 解决方案资源管理器中,右键单击SimpleProjectManager.Module \ BusinessObjects文件夹,然后选择“添加” |“添加”。类别''。将名称设置为“ Planning”,然后单击“添加”

  2. 用以下代码替换自动生成的文件内容:

    using System;
    using DevExpress.Persistent.Base;
    using DevExpress.Persistent.BaseImpl;
    using DevExpress.Xpo;
    
    namespace SimpleProjectManager.Module.BusinessObjects.Planning {
        [NavigationItem("Planning")]
        public class ProjectTask : BaseObject {
            public ProjectTask(Session session) : base(session) { }
            string subject;
            [Size(255)]
            public string Subject {
                get { return subject; }
                set { SetPropertyValue(nameof(Subject), ref subject, value); }
            }
            ProjectTaskStatus status;
            public ProjectTaskStatus Status {
                get { return status; }
                set { SetPropertyValue(nameof(Status), ref status, value); }
            }
            Person assignedTo;
            public Person AssignedTo {
                get { return assignedTo; }
                set { SetPropertyValue(nameof(AssignedTo), ref assignedTo, value); }
            }
            DateTime startDate;
            public DateTime StartDate {
                get { return startDate; }
                set { SetPropertyValue(nameof(startDate), ref startDate, value); }
            }
            DateTime endDate;
            public DateTime EndDate {
                get { return endDate; }
                set { SetPropertyValue(nameof(endDate), ref endDate, value); }
            }
            string notes;
            [Size(SizeAttribute.Unlimited)]
            public string Notes {
                get { return notes; }
                set { SetPropertyValue(nameof(Notes), ref notes, value); }
            }
            Project project;
            [Association]
            public Project Project {
                get { return project; }
                set { SetPropertyValue(nameof(Project), ref project, value); }
            }
        }
    }
    
    显示API说明

用初始数据填充数据库

从SimpleProjectManager.Module项目的Database Update文件夹中打开Updater.csUpdater.vb)文件,并覆盖ModuleUpdater.UpdateDatabaseAfterUpdateSchema方法,如下所示:

using DevExpress.Persistent.BaseImpl;
using SimpleProjectManager.Module.BusinessObjects.Marketing;
using SimpleProjectManager.Module.BusinessObjects.Planning;
// ...
public class Updater : ModuleUpdater {
    //...
    public override void UpdateDatabaseAfterUpdateSchema() {
        base.UpdateDatabaseAfterUpdateSchema();
        if (ObjectSpace.CanInstantiate(typeof(Person))) {
            Person person = ObjectSpace.FindObject<Person>(
                CriteriaOperator.Parse("FirstName == ? && LastName == ?", "John", "Nilsen"));
            if (person == null) {
                person = ObjectSpace.CreateObject<Person>();
                person.FirstName = "John";
                person.LastName = "Nilsen";
            }
        }
        if (ObjectSpace.CanInstantiate(typeof(ProjectTask))) {
            ProjectTask task = ObjectSpace.FindObject<ProjectTask>(
                new BinaryOperator("Subject", "TODO: Conditional UI Customization"));
            if (task == null) {
                task = ObjectSpace.CreateObject<ProjectTask>();
                task.Subject = "TODO: Conditional UI Customization";
                task.Status = ProjectTaskStatus.InProgress;
                task.AssignedTo = ObjectSpace.FindObject<Person>(
                    CriteriaOperator.Parse("FirstName == ? && LastName == ?", "John", "Nilsen"));
                task.StartDate = new DateTime(2019, 1, 30);
                task.Notes = "OVERVIEW: http://www.devexpress.com/Products/NET/Application_Framework/features_appearance.xml";
            }
        }
        if (ObjectSpace.CanInstantiate(typeof(Project))) {
            Project project = ObjectSpace.FindObject<Project>(
                new BinaryOperator("Name", "DevExpress XAF Features Overview"));
            if (project == null) {
                project = ObjectSpace.CreateObject<Project>();
                project.Name = "DevExpress XAF Features Overview";
                project.Manager = ObjectSpace.FindObject<Person>(
                    CriteriaOperator.Parse("FirstName == ? && LastName == ?", "John", "Nilsen"));
                project.Tasks.Add(ObjectSpace.FindObject<ProjectTask>(
                    new BinaryOperator("Subject", "TODO: Conditional UI Customization")));
            }
        }
        if (ObjectSpace.CanInstantiate(typeof(Customer))) {
            Customer customer = ObjectSpace.FindObject<Customer>(
                CriteriaOperator.Parse("FirstName == ? && LastName == ?", "Ann", "Devon"));
            if (customer == null) {
                customer = ObjectSpace.CreateObject<Customer>();
                customer.FirstName = "Ann";
                customer.LastName = "Devon";
                customer.Company = "Eastern Connection";
            }
        }
        ObjectSpace.CommitChanges();
    }
    //...
}

在上面的代码中,对象空间用于创建初始数据。这是允许您执行CRUD(创建读取更新更新删除)操作的主要框架抽象之一。您可以在下一个主题(“定义自定义逻辑和UI元素”部分)中找到有关ObjectSpace的更多信息。

注意

您可以参考供应初始数据XPO / EF),以获取有关如何初始填充数据库的更多信息。

运行应用程序

  • WinForms应用程序

    WinForms项目被设置为默认启动项目。按开始调试F5键运行该应用程序。

    下图显示了此应用程序的自动创建的UI:

    SPM_Win

  • ASP.NET应用程序

    在解决方案资源管理器中 右键单击SimpleProjectManager.Web项目,然后从上下文菜单中选择“设为启动项目”项。按开始调试或按F5键。

    下图显示了此应用程序的自动创建的UI:

    SPM_Web

XAF使用可用的CRUD操作和其他功能(搜索,过滤,打印等)为列表视图和详细视图生成此UI。详细信息视图包含显示不同业务类属性的编辑器(文本框,备注,下拉框,图像和日期选择器等)。

查找和集合编辑器显示属于关联的属性。例如,ProjectProjectTask类参与一对多关系。“许多”部分的编辑器(ProjectTasks属性)允许用户添加,编辑,删除和导出任务。

为了显示引用属性ProjectTaskAssignedTo属性),XAF会在UI中生成人员的下拉列表,并创建一个引用数据库中Person表的外键。此下拉列表显示人员的全名,因为FullName属性是Person类的默认属性(请参阅业务类的Default属性)。

注意

您可以在“列表视图列生成”和“视图项目布局生成”主题中找到有关UI生成的更多信息。

自动创建的数据库

数据库是根据您的数据模型自动创建的。数据库列是根据数据模型中指定的持久性设置(例如,通过属性设置的字段大小)生成的。下图显示了SQL Server Management Studio中的“对象资源管理器”窗口。

SPM_DB

应用程序的导航控件包含每个数据库表的项目。这些导航项允许用户导航到带有记录的列表视图,并打开其详细视图。

下一主题: 定制应用程序UI和行为

相关文章

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