ORM这个字眼在我们操作数据库的时候,是我们使用频率最高的。它到底是个什么东西呢,我们先来看看一些对它的含义解释。
对象/关系数据库映射(object/relational mapping(ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。ORM,即Object- Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的 SQL语句打交道,只要像平时操作对象一样操作它就可以了。
对象关系映射(ORM)提供了概念性的、易于理解的模型化数据的方法。ORM方法论应当基于三个核心原则:
简单:以最基本的形式建模数据。
传达性:数据库结构被任何人都能理解的语言文档化。
精确性:基于数据模型创建正确标准化了的结构。
基于三项原则,一方面,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发企业实体模型,业务实体的设计者也可以在完全脱离数据结构
构架的基础上应用这些业务实体并构筑企业的应用系统。另一方面我们可以将那些简单而又枯草地SQL语句完全忘却,在ORM的构架中,它们对于建模者应用来
说完全是多余的。
下面我们来做一个使用ORM的实际例子:
一、在Web.config文件中配置连接数据库字符串。
<connectionStrings>
<add name="connectionString" connectionString="data source=219.90.127.39,11433;Initial Catalog=Casino;User Id=sa;Password=sZ123456;Max Pool Size=512; Min Pool Size=5" providerName="System.Data.SqlClient" />
</connectionStrings>
二、在Global.asax.ca中,执行项目启动最初始阶段,进行连接数据库命令的ConnectionString语句。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ThePart.DataHelper.ORM.ORMBase.AddDataHelper("Casino", ThePart.DataHelper.Enum.DBType.SQL,
System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
三、创建实体类基础ORMBase对象关系型数据库映射的基类。
"数据库名", "表名" ,"主键","标识列字段"
[TableInfo("Casino","AgencyStatisticsRecords","ID","ID")]
public class AgencyStatisticsRecords:ORMBase
{
public int ID { get; set; }
public string AccountTime { get; set; }
public string AgentName { get; set; }
public decimal TotalStakeScore { get; set; }
public decimal TotalWinLost { get; set; }
public int UserName { get; set; }
public int? SaleID { get; set; }
}
四、业务方法,对象映射关系数据库——表数据,获得数据对象。这里直接使用--------- 实体类.GetInfo<实体类>("需要查询的实体中的字段","查询条件",new object[]{}); 这里new object[]{}是多个参数作为对象数组,传入数据库中。
public string GetUserAgency()
{
string body = null;
StringBuilder strB = new StringBuilder();
strB.Append("SELECT ID ,AccountTime ,AgentName ,TotalStakeScore,TotalWinLost ,UserName ,SaleID FROM AgencyStatisticsRecords where ID='17'");
var agency = AgencyStatisticsRecords.GetInfo<AgencyStatisticsRecords>("ID ,AccountTime ,AgentName ,TotalStakeScore,TotalWinLost ,UserName ,SaleID", "ID='17'",new object[]{});
body ="{\"AgentName\":\""+agency.AgentName+"\",\"DateTime\":\""+agency.AccountTime+"\"" +"}";
return body;
}
五、ThePart.DataHelper.ORM.ORMBase这个对象关系映射基类,对数据库进行增删改查时的返回值有多种灵活的值形态。下面我们做一些总结以便我们以后的灵活应用:
1.直接返回DataTable——这个是最最灵活的,不必返回的数据字段,必须是实体类的字段。因为它的形态是DataTable。不是实体对象。所以SQL查询的方式更加灵活。可以是SUM(),count(),或者是在查询的过程中新生成的字段或表。例如:下面返回的DataTable字段跟BetRecords类字段没有什么关系。DataTable.Rows[0]["sumWinLost"]这个
新生的输赢统计字段取值。
/// <summary>
/// 获取用户时间段内的输赢统计
/// </summary>
/// <param name="SaleNo"></param>
/// <param name="UserName"></param>
/// <param name="StartDate"></param>
/// <param name="EndDate"></param>
/// <returns></returns>
public static DataTable GetUserSumWin(string SaleNo, string UserName, DateTime StartDate, DateTime EndDate) {
StringBuilder strSql = new StringBuilder();
strSql.Append("select ISNULL( SUM(WinLost),0) as sumWinLost from BetRecords ");
string condition = " where UserName ='" + UserName + "' and SaleID = '" + SaleNo + "' and [DateTime] between '" + StartDate + "' and '"+EndDate+"'";
strSql.Append(condition);
return BetRecords.ExecSQLDataTable("Casino",strSql.ToString(),new object[]{});
}
2.返回泛型类实体集合List<T>——这里需要映射的实体类,并且从数据库查询的字段名必须要与实体类的字段名称一样,能够匹配。例如:
public static List<SportsBetRecords> SportsGetList(string SaleID, string UserName, string classtype, string StarTime, string EndTime)
{
StringBuilder sb = new StringBuilder("1=1 and SaleID='" + SaleID + "'"); //这里声明了可变字符串类型,用来装载和追加where后面的查询条件
if (!string.IsNullOrEmpty(UserName))
{
sb.Append(" and UserName='" + UserName + "'");
}
//if (!string.IsNullOrEmpty(classtype))
// sb.Append(" and GameName='" + classtype + "'");
if (!string.IsNullOrEmpty(StarTime) && !string.IsNullOrEmpty(EndTime))
sb.Append(" and [T] between '" + Convert.ToDateTime(StarTime) + "' and '" + Convert.ToDateTime(EndTime).AddDays(1) + "'");
//实体类.GetList<实体类>("Where后面的条件","条件参数作为对象数组")——进过DataBase基类封装的GetList<T>()方法里面的一系列处理将where条件和后面的参数对象数组传给数据库作为条件
return SportsBetRecords.GetList<SportsBetRecords>(sb.ToString(), new object[] { });
}
ORMBase对象/关系型数据库映射在MVC中的应用的更多相关文章
-
ORMBase对象/关系型数据库映射在MVC中的应用(二)
3.DataBase基类,查询方法返回值是List<T>,并且是分页的,ThePart.dll版本2.0中封装了一个PageInfo类,作为分页的类型.这种方法很机械,也很狗血..建议大家 ...
-
对象关系型数据库管理系统(PostgresQL )
PostgresQL是 对象关系型数据库管理系统(ORDBMS).PostgreSQL支持大部分SQL标准并且提供了许多其他现代特性:复杂查询.外键.触发器.视图.事务完整性.MVCC.同样,Po ...
-
SQLite vs MySQL vs PostgreSQL:关系型数据库比较
自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛.面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景 ...
-
[置顶] Nosql笔记(一)——关系型数据库回顾
Nosql笔记(一)——关系型数据库回顾 在平常的商业应用中,我们所使用的大多都是关系型数据库,诸如SQL Server. MY SQL. Oracle等. 关于关系型数据库中的关键技术: 存储引擎 ...
-
NodeJS旅程 : express - nodejs MVC 中的王牌
express 正如ASP.NET MVC 在作为.net平台下最佳的 Mvc框架的地位一样,express在 node.js 环境也有着相同的重要性.在百度上 "nodejs expres ...
-
Daject初探 - 一个开源关系型数据库对象关系映射(ORM)模型
Daject简介 Daject是用php写的一个关系型数据库抽象模型,通过该模型,可以在不写任何SQL或写很少的SQL就能执行大多数数据库查询操作.Daject具有面向对象,跨数据库的优点,通过数据库 ...
-
MVC 中的Model对象
最近实在是太忙,客户丢了一个框架,没有任何说明文档,更没有所谓的技术支持,一直忙于学习,最后好歹还有点头绪,话不多说,MVC的学习是不能拉下的,就当前小白的我,认为MVC中的M并不是想象中的那样简单, ...
-
ORM对象关系型映射的用法
ORM对象关系型映射的用法 -- Django模型 1.什么是ORM关系型映射 ORM 全拼Object-Relation Mapping. 中文意为 对象-关系映射. 主要实现模型对象到关系数据库数 ...
-
[原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
-
【JS基础】算法
Math 对象 Math.sqrt() //返回一个数的平方根
-
[KOJ6024]合并果子&#183;改(强化版)
[COJ6024]合并果子·改(强化版) 试题描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多把这些果子堆排成一排,然后所有的果子合成一堆. 每一次合并 ...
-
使用select io复用实现超时设置
在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...
-
PSYoungGen /PSOldGen/PSPermGen区别
原文地址:http://bbs.csdn.net/topics/210064791 谁能解译一下PSYoungGen /PSOldGen/PSPermGen区别及出现的问题? 看来没有收集到答案,查看 ...
-
RTP头结构解析
RTP包头前12个固定字节机构图: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 ...
-
给tableView设置headerView时遇到的问题
在ViewDidLoad里面设置了 self.tableView.tableHeaderView = 自定义的View 然后在模拟器上运行后,发现这个HeaderView挡住了后面的Cell,也就是c ...
-
Python之Django rest_Framework(3)
补充: 为什么要前后端分离: a.因为前端它有自己框架,这样它的效率就非常高 b.不做前后端分离,公司如果既有客户端,又有app这种情况下你就的写两遍 django rest ...
-
CSS中image和text显示高度不一致的问题
将它们分别添加新的属性: float: left 就可以解决
-
aapt获取包名和activity,启动app
1.android sdk的环境安装好了之后,在build-tools\** 的目录下找到aapt.exe,将这个路径设置环境变量,添加到path下 2.在cmdl里面输入:aapt,出现以下内容就是 ...
-
linux redhat NFS网络共享搭建
nfs网络共享 测试环境: 服务端:redhat6.7 ip:192.168.1.100 客户端:redhat6.7 ip:192.168.1.110 一.服务端 1.创建共享文件夹 权限666即可 ...