DevExpress ASP.NET 使用经验谈(1)-XPO模型的创建
这个系列通过一些简单例子循序渐进,介绍DevExpress ASP.NET控件的使用。先来介绍一下XPO的使用,安装的DevExpress版本为DXperienceUniversal-12.2.4,使用Visual Studio 2012+Sql Server2005。
什么是XPO?
XPO 是 eXpress Persistent Objects的缩写,它是DevExpress公司推出的一个运行在.NETFramwork平台上的ORM工具。Persistent Objects翻译过来时“持久化对象”的意思,所谓的持久化,也就是将数据存储下来,比如存在数据库、文件等这样的形式“永久的”保存下来。XPO是一个ORM工具,它在应用程序代码和数据库之间扮演了一个中间层的角色,起到中间桥梁这样一个作用,简单而言,就是将面向对象编程所建立的对象在数据库中做一个映射,使之和数据库中的表建立一一对应的关系。我们在面向对象编程的时候,只需要关心程序中的“对象”就可以了,XPO会自动的把我们对对象的操作反应到数据库中。
安装过程在此略过。。。
安装成功后,VS2012新建项目,就会有已安装DevExpress类别选项,如下图所示:
(图一) 新建解决方案
(图二)添加类库项目
(图三) 建立XPO的ORM模型向导
(图四)选择映射到现有数据库
(图五)选择数据库,输入UserName,Password,此处勾选导和存储过程,后续步骤将出现存储过程选择界面
(图六) 确认选择的表
(图七)确认选择的存储过程
(图八)数据库表、字段前缀、后缀等设置
(图九)完成
(图十) 新建模型未保存界面
(图十一)新建模型保存后,生成XXXCode目录
(图十二) 生成代码目录结构
自动生成的代码:
ConnectionHelper.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using System; using DevExpress.Xpo; using DevExpress.Data.Filtering; namespace XPOModel.DemoDB { public static class ConnectionHelper { public const string ConnectionString = @"XpoProvider=MSSqlServer;data source=.;user id=demo;password=demo;initial catalog=DemoDB;Persist Security Info=true" ; public static void Connect(DevExpress.Xpo.DB.AutoCreateOption autoCreateOption) { XpoDefault.DataLayer = XpoDefault.GetDataLayer(ConnectionString, autoCreateOption); XpoDefault.Session = null ; } public static DevExpress.Xpo.DB.IDataStore GetConnectionProvider(DevExpress.Xpo.DB.AutoCreateOption autoCreateOption) { return XpoDefault.GetConnectionProvider(ConnectionString, autoCreateOption); } public static DevExpress.Xpo.DB.IDataStore GetConnectionProvider(DevExpress.Xpo.DB.AutoCreateOption autoCreateOption, out IDisposable[] objectsToDisposeOnDisconnect) { return XpoDefault.GetConnectionProvider(ConnectionString, autoCreateOption, out objectsToDisposeOnDisconnect); } public static IDataLayer GetDataLayer(DevExpress.Xpo.DB.AutoCreateOption autoCreateOption) { return XpoDefault.GetDataLayer(ConnectionString, autoCreateOption); } } } |
StoredProcHelper.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | using System; using DevExpress.Xpo; using DevExpress.Data.Filtering; namespace XPOModel.DemoDB { public static class SprocHelper { public static DevExpress.Xpo.DB.SelectedData ExecAspNetPager(Session session, int pageSize, int curPage, string viewName, string fieldName, string orderField, string orderType, string where1) { return session.ExecuteSproc( "" , new OperandValue(pageSize), new OperandValue(curPage), new OperandValue(viewName), new OperandValue(fieldName), new OperandValue(orderField), new OperandValue(orderType), new OperandValue(where1)); } public static DevExpress.Xpo.DB.SelectedData ExecSelectjqGridUsers(Session session, int PageIndex, string SortColumnName, string SortOrderBy, int NumberOfRows) { return session.ExecuteSproc( "SelectjqGridUsers" , new OperandValue(PageIndex), new OperandValue(SortColumnName), new OperandValue(SortOrderBy), new OperandValue(NumberOfRows)); } public static System.Collections.Generic.ICollection<SelectjqGridUsersResult> ExecSelectjqGridUsersIntoObjects(Session session, int PageIndex, string SortColumnName, string SortOrderBy, int NumberOfRows) { return session.GetObjectsFromSproc<SelectjqGridUsersResult>( "SelectjqGridUsers" , new OperandValue(PageIndex), new OperandValue(SortColumnName), new OperandValue(SortOrderBy), new OperandValue(NumberOfRows)); } public static XPDataView ExecSelectjqGridUsersIntoDataView(Session session, int PageIndex, string SortColumnName, string SortOrderBy, int NumberOfRows) { DevExpress.Xpo.DB.SelectedData sprocData = session.ExecuteSproc( "SelectjqGridUsers" , new OperandValue(PageIndex), new OperandValue(SortColumnName), new OperandValue(SortOrderBy), new OperandValue(NumberOfRows)); return new XPDataView(session.Dictionary, session.GetClassInfo( typeof (SelectjqGridUsersResult)), sprocData); } public static void ExecSelectjqGridUsersIntoDataView(XPDataView dataView, Session session, int PageIndex, string SortColumnName, string SortOrderBy, int NumberOfRows) { DevExpress.Xpo.DB.SelectedData sprocData = session.ExecuteSproc( "SelectjqGridUsers" , new OperandValue(PageIndex), new OperandValue(SortColumnName), new OperandValue(SortOrderBy), new OperandValue(NumberOfRows)); dataView.PopulateProperties(session.GetClassInfo( typeof (SelectjqGridUsersResult))); dataView.LoadData(sprocData); } } } |
Users.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 | using System; using DevExpress.Xpo; using DevExpress.Data.Filtering; namespace XPOModel.DemoDB { public partial class Users { public Users(Session session) : base (session) { } public override void AfterConstruction() { base .AfterConstruction(); } } } |
Users.Designer.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | using System; using DevExpress.Xpo; using DevExpress.Data.Filtering; namespace XPOModel.DemoDB { public partial class Users : XPLiteObject { int fUserID; [Key( true )] public int UserID { get { return fUserID; } set { SetPropertyValue< int >( "UserID" , ref fUserID, value); } } string fUserName; [Size(50)] public string UserName { get { return fUserName; } set { SetPropertyValue< string >( "UserName" , ref fUserName, value); } } string fFirstName; [Size(50)] public string FirstName { get { return fFirstName; } set { SetPropertyValue< string >( "FirstName" , ref fFirstName, value); } } string fLastName; [Size(50)] public string LastName { get { return fLastName; } set { SetPropertyValue< string >( "LastName" , ref fLastName, value); } } string fMiddleName; [Size(50)] public string MiddleName { get { return fMiddleName; } set { SetPropertyValue< string >( "MiddleName" , ref fMiddleName, value); } } string fEmailID; [Size(50)] public string EmailID { get { return fEmailID; } set { SetPropertyValue< string >( "EmailID" , ref fEmailID, value); } } } } |
至此,已经完成了从数据库到XPO模型的创建,接下来开始使用XPO对象,看看它给我们带来了什么?
下一节中,我们继续使用XPO,结合XpoDataSource与ASPxGridView,以极少的代码,完成单表CRUD操作。
-------------------------------------------------------------------------------------------------------
附示例数据库的建库脚本,使用SQL Server2005 数据库,SQL语句如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | CREATE DATABASE [DemoDB] ON PRIMARY ( NAME = N 'DemoDB' , FILENAME = N 'C:\DemoDB.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N 'DemoDB_log' , FILENAME = N 'C:\DemoDB_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) GO EXEC dbo.sp_dbcmptlevel @dbname=N 'DemoDB' , @new_cmptlevel=90 GO IF (1 = FULLTEXTSERVICEPROPERTY( 'IsFullTextInstalled' )) begin EXEC [DemoDB].[dbo].[sp_fulltext_database] @ action = 'disable' end GO ALTER DATABASE [DemoDB] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [DemoDB] SET ANSI_NULLS OFF GO ALTER DATABASE [DemoDB] SET ANSI_PADDING OFF GO ALTER DATABASE [DemoDB] SET ANSI_WARNINGS OFF GO ALTER DATABASE [DemoDB] SET ARITHABORT OFF GO ALTER DATABASE [DemoDB] SET AUTO_CLOSE OFF GO ALTER DATABASE [DemoDB] SET AUTO_CREATE_STATISTICS ON GO ALTER DATABASE [DemoDB] SET AUTO_SHRINK OFF GO ALTER DATABASE [DemoDB] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [DemoDB] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [DemoDB] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [DemoDB] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [DemoDB] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [DemoDB] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [DemoDB] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [DemoDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [DemoDB] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [DemoDB] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [DemoDB] SET READ_WRITE GO ALTER DATABASE [DemoDB] SET RECOVERY FULL GO ALTER DATABASE [DemoDB] SET MULTI_USER GO ALTER DATABASE [DemoDB] SET PAGE_VERIFY CHECKSUM GO USE [DemoDB] GO IF NOT EXISTS ( SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N 'PRIMARY' ) ALTER DATABASE [DemoDB] MODIFY FILEGROUP [ PRIMARY ] DEFAULT GO USE [DemoDB] GO /****** Object: Table [dbo].[Users] Script Date : 2014/11/27 13:36:56 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Users]( [UserID] [ int ] IDENTITY(1,1) NOT NULL , [UserName] [nvarchar](50) NULL , [FirstName] [nvarchar](50) NULL , [LastName] [nvarchar](50) NULL , [MiddleName] [nvarchar](50) NULL , [EmailID] [nvarchar](50) NULL , CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ( [UserID] ASC ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ] ) ON [ PRIMARY ] GO |
博文作者:挪威森林(Coding of life)
博文出处:http://www.cnblogs.com/allenlf/
主要研究:Web开发框架、ORM框架、WCF框架、医疗行业软件开发(HRP、EMR、CP、OA)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)