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[] { });
}