ORM這個字眼在咱們操做數據庫的時候,是咱們使用頻率最高的。它究竟是個什麼東西呢,咱們先來看看一些對它的含義解釋。數據庫
對象/關係數據庫映射(object/relational mapping(ORM))這個術語表示一種技術,用來把對象模型表示的對象映射到基於SQL的關係模型數據庫結構中去。ORM,即Object- Relational Mapping(對象關係映射),它的做用是在關係型數據庫和業務實體對象之間做一個映射,這樣,咱們在具體的操做業務對象的時候,就不須要再去和複雜的 SQL語句打交道,只要像平時操做對象同樣操做它就能夠了。
對象關係映射(ORM)提供了概念性的、易於理解的模型化數據的方法。ORM方法論應當基於三個核心原則:
簡單:以最基本的形式建模數據。
傳達性:數據庫結構被任何人都能理解的語言文檔化。
精確性:基於數據模型建立正確標準化了的結構。
基於三項原則,一方面,建模者經過收集來自那些熟悉應用程序但不熟練的數據建模者的人的信息開發企業實體模型,業務實體的設計者也能夠在徹底脫離數據結構 構架的基礎上應用這些業務實體並構築企業的應用系統。另外一方面咱們能夠將那些簡單而又枯草地SQL語句徹底忘卻,在ORM的構架中,它們對於建模者應用來 說徹底是多餘的。數組
下面咱們來作一個使用ORM的實際例子:數據結構
1、在Web.config文件中配置鏈接數據庫字符串。app
<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>
ide
2、在Global.asax.ca中,執行項目啓動最初始階段,進行鏈接數據庫命令的ConnectionString語句。ui
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);
}spa
3、建立實體類基礎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; }
}ci
4、業務方法,對象映射關係數據庫——表數據,得到數據對象。這裏直接使用--------- 實體類.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;
}
5、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[] { }); }