使用简单ORM开发框架进行快速开发
第一部分ORM快速开发框架介绍
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。
ORM快速开发框架分为两部分,一部分为ORM核心类库,用于系统与数据库之间的操作交互和实体类与SQL语句之间的转换。另一部分为ORM自动生成工具,用于实体类,前台HTML代码,业务逻辑调用代码的自动生成。
第二部分 使用简单ORM框架进行快速开发
我们以一个简单的新闻系统作为实例来讲解如何使用ORM框架进行快速开发。
一 新闻系统功能介绍
二 业务流程定义
(1)新闻添加
正常流程:用户进入新闻添加页面,输入标题,内容等信息,点提交按钮,完成新闻录入操作。
异常流程:如果用户输入的数据不合法或没有输入标题,内容等信息,系统应该给与提示信息告知用户。
(2)新闻修改
前置条件:用户进入新闻查询页面,进行查询,系统返回新闻查询列表。
正常流程:选择要修改的新闻点击,打开新闻修改页,修改完毕,点保存完成修改操作。
异常流程:如果用户输入的数据不合法或没有输入标题,内容等信息,系统应该给与提示信息告知用户。
(3)新闻删除
前置条件:用户进入新闻查询页面,进行查询,系统返回新闻查询列表。
正常流程:用户选择要删除的新闻点【删除】,系统出现【确认删除?】对话框,点【确认】,完成新闻删除。
异常流程:如果此信息不存在或用户在【确认删除?】对话框,点【否】,则删除操作停止。
(4)新闻查询
前置条件:用户进入新闻查询页面。
正常流程:用户输入新闻标题,点提交,页面返回查询信息的列表。
异常流程:如果查询的信息不存在,则页面返回【您查询的信息不存在】。
三 数据库设计
数据库名称:ORMNewsSystem
表名:ORMNewsTable
表结构:
字段名 |
字段类型 |
是否主键 |
默认值 |
是否可空 |
说明 |
Id |
int |
是 |
否 |
新闻ID |
|
Title |
nvarchar(50) |
否 |
新闻标题 |
||
Content |
ntext |
是 |
新闻内容 |
||
CreateDate |
datetime |
Getdate() |
创建日期 |
四 页面原型设计
页面原型法是一种表达需求和实现软件之间真实程度的很好的表达方式,是在系统未开发出来时,与客户进行沟通的重要方式。通过原型法可以更小的缩短开发与客户需求之间的理解差距,是需求获取和分析阶段的重要的手段之一。
(1)查询页面
(2)添加页面
(3)修改页面
(4)详细页
五 建立解决方案
新闻系统的解决方案分为两个项目,一个项目为Web站点项目,主要实现系统的页面层和业务逻辑层。
另一个为ORMModel类库项目,主要存在数据库与类之间的对应关系(O-R-M)。
两个工程必须引用ORM快速开发框架的核心DLL【SoftWare.SimpleORM.Library.dll】。
Web项目中的Web.config配置如下
<appSettings>
<!--定义ORM数据库访问链接字符串-->
<add key="ORMConnectionString" value="Server=.;database=ORMNewsSystem;uid=sa;pwd=sa;"/>
<!--定义ORM数据库访问提供者-->
<add key="ORMDataBaseProvider" value="System.Data.SqlClient"/>
</appSettings>
六 ORM实体类生成
(1) 打开【ORM生成工具】。
(2)设置要生成的数据库信息,一级批量生成目录【如下图】。
(3)完成批量生成,并把生成后的代码拷贝到项目中。
七 完成业务逻辑
(1)完成模型页面到aspx页面的转换,输入部分可以使用工具自动生成前台代码。
(2)为【添加】,【修改】,【查询】等添加业务逻辑代码,业务逻辑代码可以直接使用生成工具生成。
(3)必须引用的命名空间
using ORMNewsSystem.Model;
using SoftWare.SimpleORM.Library;
(4)添加逻辑
ORMNewsTable model = new ORMNewsTable();
//model.id = (int)this.txtid.Text.Trim();
model.content = this.txtContent.Text.Trim();
model.title = this.txtTitle.Text.Trim();
model.createdate = DateTime.Now;//日期类型不要使用sql server的默认值 防止web服务器与数据库服务器日期不一致
bool result = false;
int identityId = 0;
result = ORMManager.ORMMangerInstance.CreateInsertSQL(model, out identityId);
if (result)
{
Response.Write("新闻添加成功");
}
else
{
Response.Write("新闻添加失败");
}
(5)修改逻辑
public partial class NewsEdit : System.Web.UI.Page
{
private string newsid;//记录新闻Id
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["Id"] == null)
{
Response.Write("<script>alert('新闻ID参数传递失败');history.back(-1);</script>");
return;
}
else
{
newsid = Request.QueryString["Id"].ToString();
}
if (!Page.IsPostBack)
{
BindNewsEdit();
}
}
/// <summary>
/// 查询代码
/// </summary>
protected void BindNewsEdit()
{
string strOrderBy = string.Empty;
string strWhere = " AND Id="+newsid;//查询条件
ORMNewsTable model = new ORMNewsTable();
model = ORMManager.ORMMangerInstance.CreateSelectSingleSQL(model, strWhere, strOrderBy);
this.txtTitle.Text = model.title;
this.txtContent.Text = model.content;
}
/// <summary>
/// 更新代码
/// </summary>
protected void btnSave_Click(object sender, EventArgs e)
{
//获取原对象的数据
string strOrderBy = string.Empty;
string strWhere = " AND Id=" + newsid;//查询条件
ORMNewsTable model = new ORMNewsTable();
model = ORMManager.ORMMangerInstance.CreateSelectSingleSQL(model, strWhere, strOrderBy);
//创建新的对象
model.content = this.txtContent.Text.Trim();
model.title = this.txtTitle.Text.Trim();
string insertSQL = string.Empty;
bool result = false;
int identityId = 0;
result = ORMManager.ORMMangerInstance.CreateUpdateSQL(model, out identityId);
if (result)
{
Response.Write("新闻修改成功");
}
else
{
Response.Write("新闻修改失败");
}
}
}
(6)查询,删除逻辑
public partial class NewsList : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindNewsList();
}
}
/// <summary>
/// 查询代码
/// </summary>
protected void BindNewsList()
{
IList<ORMNewsTable> list = new List<ORMNewsTable>();
string strOrderBy = string.Empty;
strOrderBy = " Id ASC ";//排序规则
string strWhere = string.Empty;//查询条件
string title = string.Empty;
title = this.txtTitle.Text.Trim();
if (title.Length > 0)
{
strWhere = " AND Title LIKE '%" + title + "%'";
}
ORMNewsTable model = new ORMNewsTable();
list = ORMManager.ORMMangerInstance.CreateSelectSQL(model, strWhere, strOrderBy);
//绑定控件代码
gvList.DataSource = list;
gvList.DataBind();
}
/// <summary>
/// 删除代码
/// </summary>
protected void gvList_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int newsId = 0;
int.TryParse(gvList.Rows[e.RowIndex].Cells[0].Text, out newsId);
ORMNewsTable model = new ORMNewsTable();
string strWhere = string.Empty;
bool result = false;
int identityId = 0;
strWhere = " AND Id= " + newsId.ToString();
result = ORMManager.ORMMangerInstance.CreateDeleteSQL(model, strWhere, out identityId);
if (result)
{
Response.Write("新闻删除成功");
}
else
{
Response.Write("新闻执行失败");
}
BindNewsList();//重新绑定
}
/// <summary>
/// 分页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void gvList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvList.PageIndex = e.NewPageIndex;
BindNewsList();
}
/// <summary>
/// 查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSearch_Click(object sender, EventArgs e)
{
gvList.PageIndex = 0;
BindNewsList();
}
}
(7)查看详细信息逻辑
public partial class NewsShow : System.Web.UI.Page
{
private string newsid;//记录新闻Id
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["Id"] == null)
{
Response.Write("<script>alert('新闻ID参数传递失败');history.back(-1);</script>");
return;
}
else
{
newsid = Request.QueryString["Id"].ToString();
}
if (!Page.IsPostBack)
{
BindNewsShow();
}
}
/// <summary>
/// 查询代码
/// </summary>
protected void BindNewsShow()
{
string strOrderBy = string.Empty;
string strWhere = " AND Id="+newsid;//查询条件
ORMNewsTable model = new ORMNewsTable();
model = ORMManager.ORMMangerInstance.CreateSelectSingleSQL(model, strWhere, strOrderBy);
this.lblTitle.Text = model.title;
this.lblContent.Text = model.content;
this.lblCreateDate.Text = model.createdate.ToString();
}
}
八 系统演示
请直接看代码演示。
演示项目下载地址:http://d.hongxuecn.com/ORMNewsSystem.rar
开发工具下载地址:http://d.hongxuecn.com/Tool.rar
开发框架下载地址;http://d.hongxuecn.com/Library.rar
本文档doc文件整体下载地址:http://d.hongxuecn.com/help.rar
九 共享学习
这套框架和开发工具是业余时间开发完成的,没有经过专业的测试,在这里与大家分享出来,一起讨论交流,里面有很多问题和设计不足的地方,请大家批评指正。