亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

XAF應用開發教程(二)業務對象模型之簡單類型屬性

2019-11-14 13:40:17
字體:
來源:轉載
供稿:網友

使用過ORM的朋友對這一部分理解起來會非常快,如果沒有請自行補習吧:D.

不說廢話,首先,我們來開發一個簡單的CRM系統,CRM系統第一個信息當然是客戶信息。我們只做個簡單 的客戶信息來了解一下XAF好了。

 

新建項之后,可以看到如下代碼界面:

using System;using System.Linq;using System.Text;using DevExPRess.Xpo;using DevExpress.ExpressApp;using System.ComponentModel;using DevExpress.ExpressApp.DC;using DevExpress.Data.Filtering;using DevExpress.Persistent.Base;using System.Collections.Generic;using DevExpress.ExpressApp.Model;using DevExpress.Persistent.BaseImpl;using DevExpress.Persistent.Validation;namespace XCRMDemo.Module.BusinessObjects{    [DefaultClassOptions]    //[ImageName("BO_Contact")]    //[DefaultProperty("DisplayMemberNameForLookupEditorsOfThisType")]    //[DefaultListViewOptions(MasterDetailMode.ListViewOnly, false, NewItemRowPosition.None)]    //[Persistent("DatabaseTableName")]    // Specify more UI options using a declarative approach (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument112701.aspx).    public class 客戶 : BaSEObject    { // Inherit from a different class to provide a custom primary key, concurrency and deletion behavior, etc. (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument113146.aspx).        public 客戶(session session)            : base(session)        {        }        public override void AfterConstruction()        {            base.AfterConstruction();            // Place your initialization code here (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument112834.aspx).        }        //private string _PersistentProperty;        //[XafDisplayName("My display name"), ToolT//[ModelDefault("EditMask", "(000)-00"), Index(0), VisibleInListView(false)]        //[Persistent("DatabaseColumnName"), RuleRequiredField(DefaultContexts.Save)]        //public string PersistentProperty {        //    get { return _PersistentProperty; }        //    set { SetPropertyValue("PersistentProperty", ref _PersistentProperty, value); }        //}        //[Action(Caption = "My UI Action", ConfirmationMessage = "Are you sure?", ImageName = "Attention", AutoCommit = true)]        //public void ActionMethod() {        //    // Trigger a custom business logic for the current record in the UI (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument112619.aspx).        //    this.PersistentProperty = "Paid";        //}    }}

1.為客戶類填加屬性,填加屬性后將對應著數據庫中的字段:

我將在代碼中依次填加,姓名、禁用、性別、出生日期、手機號碼、地址、年收入、照片,幾個字段。

  1 using System;  2 using System.Linq;  3 using System.Text;  4 using DevExpress.Xpo;  5 using DevExpress.ExpressApp;  6 using System.ComponentModel;  7 using DevExpress.ExpressApp.DC;  8 using DevExpress.Data.Filtering;  9 using DevExpress.Persistent.Base; 10 using System.Collections.Generic; 11 using System.Drawing; 12 using DevExpress.ExpressApp.Model; 13 using DevExpress.Persistent.BaseImpl; 14 using DevExpress.Persistent.Validation; 15  16 namespace XCRMDemo.Module.BusinessObjects 17 { 18     [DefaultClassOptions] 19     //[ImageName("BO_Contact")] 20     //[DefaultProperty("DisplayMemberNameForLookupEditorsOfThisType")] 21     //[DefaultListViewOptions(MasterDetailMode.ListViewOnly, false, NewItemRowPosition.None)] 22     //[Persistent("DatabaseTableName")] 23     // Specify more UI options using a declarative approach (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument112701.aspx). 24     public class 客戶 : BaseObject 25     { 26         // Inherit from a different class to provide a custom primary key, concurrency and deletion behavior, etc. (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument113146.aspx). 27         public 客戶(Session session) 28             : base(session) 29         { 30         } 31  32         public override void AfterConstruction() 33         { 34             base.AfterConstruction(); 35             // Place your initialization code here (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument112834.aspx). 36         } 37  38         //姓名、禁用、性別、出生日期、手機號碼、地址、年收入、照片 39         private string _姓名; 40  41         public string 姓名 42         { 43             get { return _姓名; } 44             set { SetPropertyValue("姓名", ref _姓名, value); } 45         } 46  47         private bool _禁用; 48  49         public bool 禁用 50         { 51             get { return _禁用; } 52             set { SetPropertyValue("禁用", ref _禁用, value); } 53         } 54  55         private 性別 _性別; 56  57         public 性別 性別 58         { 59             get { return _性別; } 60             set { SetPropertyValue("性別", ref _性別, value); } 61         } 62  63         private DateTime _出生日期; 64  65         public DateTime 出生日期 66         { 67             get { return _出生日期; } 68             set { SetPropertyValue("出生日期", ref _出生日期, value); } 69         } 70  71         private string _手機號碼; 72  73         public string 手機號碼 74         { 75             get { return _手機號碼; } 76             set { SetPropertyValue("手機號碼", ref _手機號碼, value); } 77         } 78  79         private string _地址; 80  81         public string 地址 82         { 83             get { return _地址; } 84             set { SetPropertyValue("地址", ref _地址, value); } 85         } 86  87         private decimal _年收入; 88  89         public decimal 年收入 90         { 91             get { return _年收入; } 92             set { SetPropertyValue("年收入", ref _年收入, value); } 93         } 94  95  96         [Size(SizeAttribute.Unlimited), VisibleInListView(true)] 97         [ImageEditor(ListViewImageEditorMode = ImageEditorMode.PictureEdit, 98             DetailViewImageEditorMode = ImageEditorMode.PictureEdit, 99             ListViewImageEditorCustomHeight = 40)]100         public byte[] 照片101         {102             get { return GetPropertyValue<byte[]>("照片"); }103             set { SetPropertyValue<byte[]>("照片", value); }104         }105     }106 107     public enum 性別108     {109         男,女,未知110     }111 }

代碼修改為上述內容后,我們再次運行系統,按下F5.

可以看到,我們新建的業務對象“客戶”已經在菜中顯示了,按下New按鈕后,可以看到詳細界面。

上面就是新建客戶信息的界面了。下面我們來分析一下原理:

在代碼中,我們使用了ORM工具,XPO定義了一個客戶類,XPO運行時,分根據代碼中的屬性創建出數據庫字段,下圖是數據庫中的表情況:

可以看出,xpo自動為我們建立了“客戶”表,字段與“客戶”類中的屬性是一一對應的,但Oid,OptimisticLockField,GCRecord三個字段是我們沒有建立的屬性,卻出現了,其中:

Oid,是GUID類型,主鍵,這是因為我們的代碼中是這樣寫的:

public class 客戶 : BaseObject

Oid是在BaseObject中定義的,所以客戶類會自動建立這個字段。

OptimisticLockField:是XAF為了解決并發沖突而建立的字段。

GCRecord:繼承自BaseObject的類在刪除記錄時只是邏輯刪除,即只是將GCRecord中記錄一個值,而沒有刪除的記錄則為Null.
屬性的寫法:

最簡單的,當我們想在數據庫中定義一個字段時,可以在xpo類中寫一個屬性,當然這種說法很膚淺,但是為了方便理解,剛開始時這樣認為就可以了。

 39         private string _姓名; 40  41         public string 姓名 42         { 43             get { return _姓名; } 44             set { SetPropertyValue("姓名", ref _姓名, value); } 45         }
這個屬性和以往開發中的方法沒有什么大的不同,僅是在set部分調用了SetPropertyValue方法,xpo為我們提供了一系列基類,SetPropertyValue是多數類中都有的,它的功能是可以在有值被設置時,需要得到屬性變化時可以及時的得到通知。
當然,也可以直接使用
public string 姓名{get;set;}
這樣來定義出姓名屬性,但是有些場景時卻會帶來麻煩。
如:
public int 數量{get;set;}
public int 價格{get;set;}
public int 總價{get{return 數量*價格;}}
在數量和價格發生變化時,我們卻看不到總價發生變化,因為控件不知道數量、價格已經變化了。所以我們應該盡量使用SetPropertyValue進行寫set.

可以看到,字符串類型的姓名,在界面上最終顯示成了一個文本框,XAF中內置了很多這樣的控件,與類型做出了對應關系,當我們使用對應的類型時,就會自動使用對應的控件,這里的控件被叫做編輯器(PropertyEditor)。

接下來,有禁用屬性:
        private bool _禁用;        public bool 禁用        {            get { return _禁用; }            set { SetPropertyValue("禁用", ref _禁用, value); }        }

同樣的,在視圖中可以看到一個CheckBox編輯器出現了。

 

  private DateTime _出生日期;        public DateTime 出生日期        {            get { return _出生日期; }            set { SetPropertyValue("出生日期", ref _出生日期, value); }        }

DateTime類型,直接使用CLR類型Datetime,日期型字段將在數據庫中創建。

可以看出,xpo使用clr類型映射到了數據中字段的類型,下表中說明了數據庫表中的字段類型與CLR類型的對應關系:

字段映射

除了自動建立的3個字段外,別的字段都是與代碼有對應關系的映射了,xpo默認支持以下幾種類型的映射:

C# System data typeAdvantageAsaAseDB2FirebirdMySQLMS accessMSSQLMSSQL CEOraclePervasive SQLPostgre SQLVistaDB
System.Booleanlogicalbitbitchar(1)char(1)bitbitbitbitnumber(1,0)bitboolBit
System.Byteshorttinyinttinyintsmallintnumeric(3,0)tinyint unsignedbytetinyinttinyintnumber(3,0)smallintsmallintInt
System.SByteshortnumeric(3,0)numeric(3,0)numeric(3,0)numeric(3,0)tinyintshortnumeric(3,0)numeric(3,0)number(3,0)numeric(3,0)smallintSmallInt
System.Charchar(1)char(1)nchar(1)char(1)char CHARACTER SET UNICODE_FSScharchar(1)nchar(1)nchar(1)ncharchar(1)char(1)NChar
System.Decimalmoneymoneymoneydecimal(28,4)decimal(18,4)doublecurrencymoneynumeric(19,4)number(19,5)decimal(20,4)decimal(28,8)Decimal
System.Doubledoubledouble precisiondouble precisiondouble precisiondouble precisiondoubledoubledouble precisionfloatdouble precisiondoubledouble precisionFloat
System.SingledoublefloatfloatfloatfloatrealsinglefloatrealfloatrealrealFloat
System.Int16shortsmallintsmallintsmallintsmallintsmallintshortsmallintsmallintnumber(5,0)smallintsmallintSmallInt
System.UInt16integernumeric(5,0)numeric(5,0)numeric(5,0)numeric(5,0)smallint unsignedintnumeric(5,0)numeric(5,0)number(5,0)numeric(5,0)numeric(5,0)Int
System.Int32integerintnumeric(10,0)intintegerintintintintintintegerintInt
System.UInt32moneynumeric(10,0)numeric(10,0)numeric(10,0)numeric(10,0)int unsigneddecimal(10,0)numeric(10,0)numeric(10,0)numeric(10,0)numeric(10,0)numeric(10,0)BigInt
System.Int64moneybigintnumeric(20,0)bigintbigintbigintdecimal(20,0)bigintbigintnumber(20,0)bigintbigintBigInt
System.UInt64moneynumeric(20,0)numeric(20,0)numeric(20,0)numeric(18,0)bigint unsigneddecimal(20,0)numeric(20,0)numeric(20,0)number(20,0)numeric(20,0)numeric(20,0)BigInt
System.Guidchar(36)UNIQUEIDENTIFIERSTRchar(36)char(36)char(36)char(38)guiduniqueidentifieruniqueidentifierchar(36)char(36)char(36)UniqueIdentifier
System.Enumunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying typeunderlying type
System.Stringcharvarcharnvarcharvarcharchar varyingvarcharvarcharnvarcharnvarcharnvarchar2varcharvarcharNVarChar
System.DateTimetimestampdatetimedatetimetimestamptimestampdatetimedatetimedatetimedatetimedatetimestamptimestampDateTime
System.TimeSpandoubledouble precisiondouble precisiondouble precisiondouble precisiondoubledoubledouble precisionfloatdouble precisiondoubledouble precisionFloat
System.Byte[]blobimageimageblobblobLONGBLOBlongbinaryimage, in SQL Server
versions prior to 2005;
otherwise - varbinary
imagebloblongvarbinarybyteaVarBinary
Unlimited size stringmemotexttextclobBLOB SUB_TYPE TEXTlongtextLONGTEXTntext, in SQL Server
versions prior to 2005;
otherwise - nvarchar
ntextncloblongvarchartextNText
 

上面所描述的是都簡單類型,其中枚舉類型、圖像類型、顏色,相對特殊一些,例如枚舉類型:

在代碼中,我們可以看到如下屬性定義
 55         private 性別 _性別; 56  57         public 性別 性別 58         { 59             get { return _性別; } 60             set { SetPropertyValue("性別", ref _性別, value); } 61         }
這里的性別是一個枚舉類型,定義如下:
107     public enum 性別108     {109         男,女,未知110     }
打開詳細視圖,運行效果如下:


可以看出,XAF為我們使用類型進行了推導,自動使用了下拉框,并且取得到了枚舉中有哪些值,顯示在列表中供我們選擇。XAF中的這種自動機制使用得非常多,后續我們將會看到。

圖片的存儲:

[Size(SizeAttribute.Unlimited), VisibleInListView(true)]        [ImageEditor(ListViewImageEditorMode = ImageEditorMode.PictureEdit,            DetailViewImageEditorMode = ImageEditorMode.PictureEdit,            ListViewImageEditorCustomHeight = 40)]        public byte[] 照片        {            get { return GetPropertyValue<byte[]>("照片"); }            set { SetPropertyValue<byte[]>("照片", value); }        }

圖片的存儲稍微有些不一樣,在屬性的get方法中,使用了GetPropertyValue<byte[]>來取值。

并且使用了幾種Attribute,Attribute是為了擴展元數據的描述信息,簡單來說,C#(.net)下面的語言不可能是無止境擴展的,所以提供了這樣一種特殊的類,可以用來修飾程序中的無素,如assembly,class,interface,property,field,method等 等 .

xpo+xaf定義了很多的Attribute用來描述和擴展元數據信息,其中:

Size(SizeAttribute.Unlimited) 的意義是,創建數據庫字段時,長度不限。SizeAttribute.Unlimited的值其實是-1,當然有些場景會用到限制長度。如

[Size(100)] //姓名字段數據庫類型將是nvarchar(100)

public string 姓名{......}

[ImageEditor(ListViewImageEditorMode = ImageEditorMode.PictureEdit, DetailViewImageEditorMode = ImageEditorMode.PictureEdit,ListViewImageEditorCustomHeight = 40)]
這里設置了圖像所使用的編輯器的參數,列表下面如何顯示,詳細視圖下面如何顯示,列表上顯示時控制高度。

因為本節主要介紹業務對象的創建方法,不擴展討論Attribute的用法,后續章節詳細描述。

下節介紹幾種常見的關系型數據庫節構在ORM中的實現方法。
文章示例項目源碼下載

QQ:4603528 QQ群:50185791


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产小视频在线观看| 国产精品久久久久影院日本| 欧美成人一区在线| 国产色婷婷国产综合在线理论片a| 国产成人免费av| 国产午夜一区二区| 超在线视频97| 欧美激情网友自拍| 久久人人爽人人爽人人片av高清| 欧美一级大片在线免费观看| 国产精品网红直播| 日韩电影中文字幕在线观看| 91夜夜揉人人捏人人添红杏| 亚洲人成电影网站| 日日噜噜噜夜夜爽亚洲精品| 伊人久久久久久久久久久久久| 久久久久久久电影一区| 欧美日韩免费区域视频在线观看| 国产成人一区二区在线| 亚洲a一级视频| 中文字幕精品一区久久久久| 国产精品成人久久久久| 美日韩在线视频| www欧美日韩| 91国产美女在线观看| 亚洲精品视频网上网址在线观看| 神马国产精品影院av| 伊人久久免费视频| 国产性色av一区二区| 亚洲男女自偷自拍图片另类| 日本亚洲欧洲色| 久久久久久久久爱| 欧美午夜影院在线视频| 欧美一级视频一区二区| 久久69精品久久久久久久电影好| 免费97视频在线精品国自产拍| 欧美精品福利在线| 96精品视频在线| 日韩中文字幕免费看| 欧美丰满少妇xxxxx做受| 日产日韩在线亚洲欧美| 久久中国妇女中文字幕| 日韩成人在线免费观看| 欧美性猛交99久久久久99按摩| 午夜精品久久久久久久久久久久久| 欧美中文字幕第一页| 国产亚洲欧美日韩精品| 欧美美女操人视频| 亚洲天堂免费观看| 98精品在线视频| 成人黄在线观看| 亚洲精品98久久久久久中文字幕| 久久精品中文字幕| 怡红院精品视频| 中文字幕国内精品| 日韩在线视频导航| 国产女人18毛片水18精品| 亚洲欧美成人一区二区在线电影| 欧美精品一区二区三区国产精品| 亚洲黄色av网站| 日韩美女中文字幕| 按摩亚洲人久久| 欧美极品少妇全裸体| www.亚洲成人| 夜夜嗨av一区二区三区免费区| 在线观看精品国产视频| 国产在线观看不卡| 国产91在线播放九色快色| 日韩美女福利视频| 日韩欧美在线视频日韩欧美在线视频| 亚洲第一网站免费视频| 日本一区二三区好的精华液| 日韩有码在线观看| 国产精品流白浆视频| 欧美日韩一二三四五区| 亚洲国产又黄又爽女人高潮的| 亚洲精品天天看| 成年人精品视频| 欧美精品在线看| 亚洲影院在线看| 亚洲精品国偷自产在线99热| 欧美最猛性xxxx| 人体精品一二三区| 日韩大片免费观看视频播放| 亚洲国产精品久久久久久| 日韩免费观看视频| 日韩在线精品一区| 日韩成人网免费视频| 成人444kkkk在线观看| 国产成人一区二区| 亚洲国产欧美在线成人app| 国产精品国产三级国产aⅴ浪潮| 一区二区三区 在线观看视| 亚洲伊人一本大道中文字幕| 成人羞羞国产免费| 亚洲国产成人精品久久久国产成人一区| 激情久久av一区av二区av三区| 欧洲成人午夜免费大片| 亚洲男人的天堂在线| 亚洲激情国产精品| 成人免费在线视频网址| 久久久国产一区二区| 久久久久久国产三级电影| 亚洲国产成人久久综合| 亚洲xxx大片| 久久99国产精品久久久久久久久| 精品中文字幕视频| 精品偷拍各种wc美女嘘嘘| 正在播放欧美一区| 久久午夜a级毛片| 91tv亚洲精品香蕉国产一区7ujn| 国产综合视频在线观看| 国产成人精品在线观看| 精品美女久久久久久免费| 国产一区二区在线免费视频| 国产欧美精品一区二区三区-老狼| 久久久精品免费视频| 国产日韩欧美视频在线| 国产精品第8页| 亚洲国产小视频在线观看| 中文字幕自拍vr一区二区三区| 亚洲精品福利免费在线观看| 久久精品一区中文字幕| 日韩av免费在线看| 国产日韩在线视频| 亚洲精品视频在线观看视频| 欧美日韩亚洲视频| 国产日韩欧美视频| 国产精品主播视频| 亚洲欧美日韩精品久久| 欧美丝袜美女中出在线| 欧美日韩国产一区在线| 欧美激情精品久久久久久免费印度| 欧美高清在线观看| 欧美精品一区在线播放| 久99九色视频在线观看| 91久久综合亚洲鲁鲁五月天| 亚洲人成电影网站色www| 亚洲成人av在线| 欧美精品久久久久久久久| 久久久久九九九九| 国外成人性视频| 亚洲成人黄色在线观看| 亚洲精品第一页| 国产91热爆ts人妖在线| 国产91精品青草社区| 日韩av在线天堂网| 欧美精品福利在线| 日韩在线观看免费高清| 97热精品视频官网| 国产成人精品免费久久久久| 91国内揄拍国内精品对白| 国产97色在线|日韩| 亚洲电影免费观看高清完整版| 午夜精品一区二区三区在线视频| 日韩精品在线免费观看视频| 欧美性感美女h网站在线观看免费| 自拍偷拍亚洲精品| 成人午夜在线视频一区| 亚洲日本aⅴ片在线观看香蕉| 国产精品99一区| 国产精品88a∨| 欧美视频不卡中文| 欧美成人精品一区|