XAF应用开发教程(三)业务对象模型之引用类型与关联关系

本节介绍信息系统开发中最常见的问题,引用关系,一对多关系,多对多关系。

以客户信息为例,客户通常需要客户分类,如VIP客户,普通客户,潜在客户。当然,我们可以定义枚举类型进行定义出这个类型,并在客户类上面定义对应的属性。

但枚举类型增加值需要修改程序,而客户分类很可能是会增加或是修改的,此时,我们就需要用到了引用类型。引用类型对应到数据库上,也就是外键关系。

既然是需要可以维护的客户分类,那么我们应该建立一张表出来,在XPO中就要新建出一个业务类,代码如下:

    [DefaultClassOptions]  [XafDefaultProperty("名称")]
    public class 客户分类 : BaseObject
    {
        public 客户分类(Session s):base(s)
        {

        }

        private string _名称;
        public string 名称
        {
            get { return _名称; }
            set { SetPropertyValue("名称", ref _名称, value); }
        }
    }

代码相当的简单,只有一个属性。运行系统后,客户分类已经出现在菜单中,接下来,要在客户中填加客户分类属性。

        private 客户分类 _客户分类;
        public 客户分类 客户分类
        {
            get { return _客户分类; }
            set { SetPropertyValue("客户分类", ref _客户分类, value); }
        }

接下来按下F5运行系统,看看效果。

从导航栏点击客户,再次点击新建,可以看到如下效果的编辑器。你的运行效果中没有VIP和普通用户这两个值吗?

对的,可以直接点击图中所示的倒数第二个按钮,可以新建出可选项。

回过头来看一下我们新使用的属性:

[DefaultClassOptions]
    [XafDefaultProperty("名称")]
    public class 客户分类 : BaseObject
    { .....
    }

可以看到客户分类上面使用了新的Attribute,XafDefaultPropertyAttribute,它的功能是:当类实例被显示时,使用哪个属性做为显示值,如果去掉这句话效果如下:

可以看出来,显示的是类的全名(一串GUID),这个GUID就是主键字段的值。

后面如果看到这种情况,你应该知道需要设置XafDefaultProperty就好了。

引用型字段使用的是搜索编辑器,当数据条数大于25时,将会自动的显示为弹出搜索窗口。我们可以手工向客户分类表中新建超过25条记录。

可以看到,这时的图标变成了望远镜,点击后,弹出窗口:

在弹出窗口中,按下搜索按钮,就显示出了所有记录。当然还有很多可以控制的选项,但本节主要介绍引用型关系的使用,所以不做深入讨论,后面会详细介绍。

再来看看数据库中表的变化,客户分类字段已经建立出来,并且是外键。这种建立外键的机制对数据完整性有很好的约束。当然也是可以不建立出外键的。

下面再来看看一对多关系的建立方法,有这样的需求:一个客户有多个联系人,一个联系人只属于一个客户。

我们先新建一个联系人类型:

联系人与客户为 1-1

    [XafDefaultProperty("名称")]
    public class 联系人 : BaseObject
    {
        public 联系人(Session s):base(s)
        {

        }

        private string _名称;
        public string 名称
        {
            get { return _名称; }
            set { SetPropertyValue("名称", ref _名称, value); }
        }

        private 客户 _客户;
        [Association]
        public 客户 客户
        {
            get { return _客户; }
            set { SetPropertyValue("客户", ref _客户, value); }
        }

    }

同时,在客户类中填加一个集合属性

一个客户有多个联系人 1-n

public class 客户.......
{
 .............
        [Association]
        public XPCollection<联系人> 联系人
        {
            get { return GetCollection<联系人>("联系人"); }
        }
..............
}

这里可以看到,在客户类中 联系人属性是 xpcollection<联系人>

而在联系人类中,有客户属性,它们都用了[Association]进行了标记。

是的,这个标记就是用来建立关联关系的。F5运行一下看看效果吧!

在客户列表中,点击新建,可以看到下方多了一个联系人列表,是的,这里可以存储多个联系人信息了。在联系人列表上,可以点击“New"按钮进行填加数据了。

下面再来看看多对多关系的建立,

在实现项目开发中,有这样一种情形,公司为了销售业务,通常会有业务大区的概念,一个客户可能存在于两个业务大区中,如

公司销售在上海市普陀区,嘉定区均有营业网点,客户在嘉定区居住,但离普陀区很近,可能去普陀区销费,

那么我们可以建立大区类、和客户类是多对多的关联关系:

一个大区有多个客户1-n 一个客户有多个大区1-n

大区和客户就是多对多

    [NavigationItem("基础数据")]
    [XafDefaultProperty("名称")]
    public class 销售大区 : BaseObject
    {
        public 销售大区(Session s ):base(s)
        {

        }

        private string _名称;
        public string 名称
        {
            get { return _名称; }
            set { SetPropertyValue("名称", ref _名称, value); }
        }

        [Association]
        public XPCollection<客户> 客户
        {
            get { return GetCollection<客户>("客户"); }
        }
    }

上面的代码就新建出了销售大区类型,可以看到新建的类型上我使用了

[NavigationItem("基础数据")]这样一个Attribute,它的功能是在导航菜单中,建一个导航分组,(导航分组
并把销售大区这个业务对象的列表显示在里面。

public class 客户.....
{
..................
        [Association]
        public XPCollection<销售大区> 所属大区
        {
            get { return GetCollection<销售大区>("所属大区"); }
        }
...................
}

在客户类中增加一个所属大区属性,如上所示,这样一个对多对关系就建立完成了。可以看出,和一对多其实是一样的,只是两个类中都用xpcollection<T>这个泛型类即可。

还是F5看下效果吧:

可以看到,销售大区被放到了基础数据下面点击后,出现了销售大区的列表,这时,还没有数据。在销售大区上点击新建,可以看到客户列表出现在销售大区的详细界面中了。这里点击Link按钮,可以选择大区所拥有的客户。

同样的,来看客户信息:这时,(一个客户有多个联系人,一个联系人只属于一个客户)、(客户与大区为多对多)所属大区被放到了第二个Tab页面中,XAF会判断有几个子级列表类型的集合,而建立出Tab.

如果你一直和我一样,一直使用中文编码,点开所属大区会是空白的,这是Dev的BUG,将会在15.2.5版本中修复,临时的解决方法是这样的:解决方案->XCRMDemo.Web->WebApplication.cs,右键,查看代码,来到构造函数中,加入如下语句:
   public XCRMDemoAspNetApplication() {
            InitializeComponent();
            DelayedViewItemsInitialization = false;
        }

这句话的意思是Tab中的内容不是在点击时生成的,对性能上会有些影响,后面的版本中BUG修复了就没有问题了。

这个BUG的原因是因为浏览器中的cookieName使用了中文编码,而chrome,firefox,都不支持,在safari浏览器中没有这个问题。

浏览器我一直推荐使用chrome,速度快!

学习了上面的三节知识后,就可以构建多数的表结构了,怎么样快试试吧!

原文地址:https://www.cnblogs.com/xyyhcn/p/11719513.html

时间: 2024-07-29 17:18:31

XAF应用开发教程(三)业务对象模型之引用类型与关联关系的相关文章

XAF应用开发教程(二)业务对象模型之简单类型属性

https://www.cnblogs.com/foreachlife/p/XAFBOSimpleTypeProperty.html 使用过ORM的朋友对这一部分理解起来会非常快,如果没有请自行补习吧:D. 不说废话,首先,我们来开发一个简单的CRM系统,CRM系统第一个信息当然是客户信息.我们只做个简单 的客户信息来了解一下XAF好了. 新建项之后,可以看到如下代码界面: using System; using System.Linq; using System.Text; using Dev

微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台

原文:微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 公众号第三方平台的开放,是为了让公众号运营者,在面向垂直行业需求时,可以一键登录授权给第三方的公众号运营平台,通过第三方开发者提供的公众号第三

XAF应用开发教程(六)控制器

https://www.cnblogs.com/foreachlife/p/xafviewcontrollerAndValidationContext.html 是的,XAF也是MVC结构的,但不仅限于MVC,ViewModel也存在,它是一项复合技术,AOP,ORM,MVC都有. 真实运行的系统中,仅有增删改查功能肯定是远远不够的,ERP.CRM等系统的开发中,有无数的业务逻辑,通常这些都是在控制器中实现的,控制器有两种: ViewController:应用于视图,需要操作视图的数据. Win

XAF应用开发教程(七)外观控制模块

很多时候,我们需要按照不同的条件显示不同的效果,在传统的软件开发中,我们会直接使用 控件名称.BackColor,Enable,Visible等属性进行控制. 如果一个业务对象在多处使用,要么我们会去一个地方一个地方的修改,要么会集中代码做个方法进行控制. 在XAF中,就实现了一处控制全局生效的方法. 下面我们来看看外观模块: 上图中展示了几种效果:1,整行红色背景.2,蓝色字体加删除线.3编辑时控件禁用.4.单元格颜色变化. 详细界面中,同样生效了,上面两幅图,一个是web的,一个winfor

XAF应用开发教程(一) 创建项目

XAF是DevExpress公司的快速开发框架,全称eXpress Application Framework,是企业信息系统的开发利器,快速开发效果显著,在.net框架中,笔者至今没有找到一款可以与之比较的产品.下面以应用为中心,讲述如何应用XAF. 下载与安装,如果你已经安装好了sqlserver和visual studio,请至http://www.devexpress.com 下载试用版,安装完成后即可体验. 我使用的是vs2015+sqlserver 2014(与vs内置一起的). 一

XAF应用开发教程(五)验证模块

数据验证是应用程序开发中使用频率最高的功能模块,本节详细介绍一下XAF中如何使用验证模块. XAF 验证模块内置了下面的一些验证规则: 验证规则类型 说明 RuleCombinationOfPropertiesIsUnique (RuleCombinationOfPropertiesIsUniqueAttribute) 要求多个属性的值组合在一起时是唯一的. RuleCriteria (RuleCriteriaAttribute) 要求满足指定的条件. 如:座机或手机必须填写一个. 条件为:坐机

XAF应用开发教程(四)应用程序模型

https://www.cnblogs.com/foreachlife/p/xafml.html XAF是重量型框架,确实够重量的,方方面面都做得规规矩矩. 如果看了前面三节,可能会认为,这N多的Attribute到底都是从哪里来的?到底有多少这样的Attribute?如果不够用了怎么办?等着官方开发吗? 好吧,我不是为了解决上面的这些问题的,从另一个角度来看一下我们的应用程序吧! 我们回过头来看看解决方案中的项目都是做些什么用途吧: XAF的默认项目结构中,XCRMDemo.Module中写了

XAF应用开发教程(八) 汉化与多国语言支持

https://www.cnblogs.com/foreachlife/p/5067380.html 使用了XAF开发时,汉化是一个比较常的问题. 要实现汉化很简单: 1.在这里下载汉化资源文件.这里演示的版本是15.1.X的 2.文件下载后将:文件解压到目录    <你的项目>\BIN\ 下面. 解压后如下所示: 这一步的功能是:汉化多数控件中的使用的文字资源.这是官方提供的方法,也有些字符串是没有被汉化的.因为DEV支持的语言也不少,也制做了许多国家的语言包.但CN的资源包还没有做完全汉化

公众号第三方平台开发 教程三 微信公众号授权第三方平台

这一部分挺简单的,其实就是在页面上放一个链接,引导用户跳转即可 链接的格式如下: https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx, 这里对参数做一下说明 component_appid即第三方平台的APPID(如下图) pre_auth_code为预授权码,用获得的第三方平台AccessToken作为参数进行获取,具体