DevExpress ASP.NET 使用经验谈(1)-XPO模型的创建

简介: 原文:DevExpress ASP.NET 使用经验谈(1)-XPO模型的创建这个系列通过一些简单例子循序渐进,介绍DevExpress ASP.NET控件的使用。先来介绍一下XPO的使用,安装的DevExpress版本为DXperienceUniversal-12.2.4,使用Visual Studio 2012+Sql Server2005。
原文: 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

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

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

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

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语句如下:

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

 

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
6天前
|
机器学习/深度学习 数据挖掘 Go
中科院二区7.4分|NET基因肿瘤分型+生存预后模型+分子对接
在《Journal of Translational Medicine》上发表的最新研究中,科学家们鉴定了一种新的NET相关基因签名,用于预测弥漫性大B细胞淋巴瘤(DLBCL)患者的预后。他们发现8个基因(PARVB,LYZ,PPARGC1A,HIF1A,SPP1,CDH1,S100A9和CXCL2)与DLBCL生存率显著相关,建立了NRG遗传风险模型,该模型可能有助于指导DLBCL的治疗选择。研究包括基因表达数据的分析、预后特征的构建和验证,以及与免疫微环境和潜在治疗靶点的相关性探索。
15 0
|
2月前
|
机器学习/深度学习 编解码 并行计算
SegNetr来啦 | 超越UNeXit/U-Net/U-Net++/SegNet,精度更高模型更小的UNet家族
SegNetr来啦 | 超越UNeXit/U-Net/U-Net++/SegNet,精度更高模型更小的UNet家族
40 0
|
4月前
|
算法 数据库 计算机视觉
【计算机视觉】FCN、Seg-Net、U-Net模型进行图像分割实战(附源码和数据集 超详细必看)
【计算机视觉】FCN、Seg-Net、U-Net模型进行图像分割实战(附源码和数据集 超详细必看)
73 1
|
5月前
|
开发框架 前端开发 API
私有化部署大模型:5个.Net开源项目
私有化部署大模型:5个.Net开源项目
76 0
|
9月前
|
开发框架 前端开发 安全
ASP.NET Core MVC 从入门到精通之Html辅助标签补充及模型校验基础
ASP.NET Core MVC 从入门到精通之Html辅助标签补充及模型校验基础
91 0
|
10月前
|
机器学习/深度学习 编解码 人工智能
深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt、Res2Net、Swin Transformer、Vision Transformer等模型结构、实现、模型特点详细介绍
深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt、Res2Net、Swin Transformer、Vision Transformer等模型结构、实现、模型特点详细介绍
10545 1
 深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt、Res2Net、Swin Transformer、Vision Transformer等模型结构、实现、模型特点详细介绍
|
11月前
|
机器学习/深度学习 编解码 人工智能
FCN、ReSeg、U-Net、ParseNet、DeepMask…你都掌握了吗?一文总结图像分割必备经典模型(一)(3)
FCN、ReSeg、U-Net、ParseNet、DeepMask…你都掌握了吗?一文总结图像分割必备经典模型(一)
140 0
|
11月前
|
算法 计算机视觉
FCN、ReSeg、U-Net、ParseNet、DeepMask…你都掌握了吗?一文总结图像分割必备经典模型(一)(2)
FCN、ReSeg、U-Net、ParseNet、DeepMask…你都掌握了吗?一文总结图像分割必备经典模型(一)
102 0
|
11月前
|
机器学习/深度学习 编解码 机器人
FCN、ReSeg、U-Net、ParseNet、DeepMask…你都掌握了吗?一文总结图像分割必备经典模型(一)(1)
FCN、ReSeg、U-Net、ParseNet、DeepMask…你都掌握了吗?一文总结图像分割必备经典模型(一)
107 0
|
11月前
|
并行计算 算法 数据可视化
432.4 FPS 快STDC 2.84倍 | LPS-Net 结合内存、FLOPs、CUDA实现超快语义分割模型(二)
432.4 FPS 快STDC 2.84倍 | LPS-Net 结合内存、FLOPs、CUDA实现超快语义分割模型(二)
83 0