一、概述
平臺(tái):VS2015
語(yǔ)言:C#
技術(shù):ELINQ
數(shù)據(jù)庫(kù):ORACLE
成果:一個(gè)能實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行增刪改查功能的接口
接口返回的結(jié)果:JSON格式的結(jié)果集
二、流程
1.添加網(wǎng)站,新建一個(gè)web服務(wù)。
2.添加引用:System.Data.OracleClient;通過(guò)Nuget安裝ELinq包和Newtonsoft.Json包;
3.配置數(shù)據(jù)庫(kù)連接信息。在Web.config文件中添加連接字符串:


4.先添加實(shí)體類,在其中添加命名空間:using Nlite.Data;并映射數(shù)據(jù)庫(kù)中的表,原則上實(shí)體類名要和表名一致或遵循一定規(guī)律。例如casetype類(映射Oracle數(shù)據(jù)庫(kù)中的s_casetype表):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLite.Data;
///
/// casetype的摘要說(shuō)明
///
[Table("s_casetype")]
public class casetype
{
///
///案件類型代碼
///
[Id]
publicstring typeid { get; set; }
///
///父類的代碼
///
publicstring pid { get; set; }
///
///案件類型名稱
///
publicstring typename { get; set; }
///
///說(shuō)明
///
publicstring remark { get; set; }
///
///樹類型,0是事件,1是部件
///
publicstring treetype { get; set; }
///
///區(qū)級(jí)TYPEID
///
publicstring qtypeid { get; set; }
}
其次,添加一個(gè)展示指定輸出信息的類。例如caseinfo類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
///
/// CaseInfo的摘要說(shuō)明,用于輸出的類
///
public class CaseInfo
{
///
///案件代碼
///
publicstring typeid { get; set; }
///
///父類的案件代碼
///
publicstring pid { get; set; }
///
///案件類型名稱
///
publicstring typename { get; set; }
///
///案件說(shuō)明
///
publicstring remark { get; set; }
///
///樹類型,0是事件,1是部件
///
publicstring treetype { get; set; }
///
///區(qū)級(jí)TYPEID
///
publicstring qtypeid { get; set; }
}
接著添加了HeadData類,返回操作成功與否的信息;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
///
/// HeadData的摘要說(shuō)明
///返回操作是否成功的提示信息
///
public class HeadData
{
///
///一個(gè)返回值,0表示成功
///
publicint Code { get; set; }
///
///錯(cuò)誤的信息
///
privatestring mMsg = "";
///
///錯(cuò)誤信息
///
publicstring Msg { get { return mMsg; } set { mMsg = value; } }
privateDateTime mServerTime = DateTime.Now;
///
///返回服務(wù)器時(shí)間
///
publicDateTime ServerTime { get { return mServerTime; } set { mServerTime = value; }}
///
///返回結(jié)果的數(shù)量
///
publicint Count { get; set; }
///
///業(yè)務(wù)邏輯處理結(jié)果
///
publicbool Result { get; set; }
}
public enum codetype
{
///
///執(zhí)行成功
///
CODE_OK = 0,
///
///執(zhí)行失敗
///
CODE_ERROR = 1
}
再添加Returntype類,以JSON格式返回結(jié)果集。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
///
/// returntype的摘要說(shuō)明
///
public class returntype
{
publicstatic void Json(HttpResponse Resp, HeadData head, object data)
{
if (string.IsNullOrEmpty(Resp.ContentType)) //為啥要判斷一下?
{
Resp.ContentType = "text/json";
}
object objData = new//輸出的內(nèi)容詳情
{
Code = head.Code,
Errmsg = head.Msg,
ServerTime = head.ServerTime,
Result = head.Result,
Count = head.Count,
Data = data
};
//設(shè)置時(shí)間格式
IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); //實(shí)例化一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)時(shí)間格式的對(duì)象
timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";//指定輸出的時(shí)間格式
IList converts = new List(); //初始化實(shí)例,表示可按照索引單獨(dú)訪問(wèn)的一組對(duì)象,轉(zhuǎn)換對(duì)象為JSON,沒(méi)懂?
converts.Add(timeFormat);//添加時(shí)間格式,沒(méi)懂?
//設(shè)置輸出語(yǔ)句
Resp.Write(JsonConvert.SerializeObject(objData, Newtonsoft.Json.Formatting.None,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters =converts
}));//將字符串寫如HTTP響應(yīng)輸出流,JsonConvert類提供.NET和JSON類型轉(zhuǎn)換的方法:SerializeObject方法(具體連載對(duì)象,默認(rèn)格式,初始化一個(gè)JSON連載設(shè)置)
}
}
5.再添加SsisDbContext類,在這個(gè)類中連接數(shù)據(jù)庫(kù)(創(chuàng)建DbConfiguration對(duì)象、設(shè)置SQL語(yǔ)句輸出日志、注冊(cè)實(shí)體到數(shù)據(jù)表的映射關(guān)系),然后創(chuàng)建DbSet對(duì)象(表示用于執(zhí)行插入、讀取、更新和刪除操作的類型化實(shí)體集,對(duì)實(shí)體集的所有增刪改查操作會(huì)立即同步到數(shù)據(jù)庫(kù)對(duì)應(yīng)的表中)。
5.1映射關(guān)系總結(jié):
一對(duì)一:第一種是一對(duì)一主鍵關(guān)聯(lián),要求兩個(gè)主鍵必須完全一致;第二種是一對(duì)一外鍵關(guān)聯(lián)(未懂)。例子,一個(gè)球隊(duì)對(duì)應(yīng)一個(gè)地址。
一對(duì)多:例如,從球隊(duì)角度來(lái)說(shuō),一個(gè)球隊(duì)擁有多個(gè)球員
多對(duì)一:例如,從球員角度來(lái)說(shuō),多個(gè)球員屬于一個(gè)球隊(duì)
多對(duì)多:如學(xué)生與選修課之間的關(guān)系,一個(gè)學(xué)生可以選擇多門選修課,每門選修課又可以被多名學(xué)生選擇。一般是采用中間表的方式處理,轉(zhuǎn)化為兩個(gè)一對(duì)多。
代碼示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLite;
using NLite.Data;
///
/// SsisDbContext的摘要說(shuō)明
///
public class SsisDbContext:DbContext
{
conststring CONNECTIONNAME = "Northwind";
staticNLite.Data.DbConfiguration dbConfig = NLite.Data.DbConfiguration.Configure(CONNECTIONNAME)
.SetSqlLogger(() => new SqlLog(Console.Out))
.AddClass()
.AddClass(m =>
{
m.OneToOne(e => e.CaseType).ThisKey(e =>e.TYPEID).OtherKey(e => e.TYPEID);
})
.AddClass(m =>
{
m.ManyToOne(e => e.CaseTypeList).ThisKey(e =>e.TYPEID).OtherKey(e => e.TYPEID);
});//設(shè)置SQL語(yǔ)句輸出日志,注冊(cè)實(shí)體到數(shù)據(jù)表的映射關(guān)系,從caseinfo的角度來(lái)說(shuō),caseinfomodel與casetypemodel是一對(duì)一的關(guān)系
publicSsisDbContext():base(dbConfig)//根據(jù)DbConfiguration創(chuàng)建DbContext的對(duì)象
{
//
// TODO:在此處添加構(gòu)造函數(shù)邏輯
//ELinq
}
publicreadonly IDbSet CaseInformation;//表示用于執(zhí)行插入、讀取、更新和刪除操作的類型化實(shí)體集,對(duì)實(shí)體集中所有的增刪改查操作會(huì)立即同步到數(shù)據(jù)庫(kù)對(duì)應(yīng)的表中
publicreadonly IDbSet CASEINFO;
publicreadonly IDbSet CASETYPE;
}
6.主體代碼編寫(實(shí)現(xiàn)增刪改查)
在using( SsisDbContext db = new SsisDbContext()) {}中寫基于ELINQ技術(shù)的增刪改查的語(yǔ)句。
6.1查詢:
varquery= db.caseinformation.where(condition1 ).select(c=> new OutClass{ ….}).ToList();
其中where語(yǔ)句中寫篩選條件,select語(yǔ)句將序列中的每個(gè)元素投影到新表中,tolist語(yǔ)句將表轉(zhuǎn)換為集合
6.2插入-insert:
vara =newcasetype
{
typeid = typeidval,
pid = pidval,
typename =typenameval,
remark = remarkval,
treetype =treetypeval,
qtypeid =qtypeidval
};
db.CaseInformation.Insert(a);//插入語(yǔ)句
6.3更新修改-update(會(huì)返回一個(gè)INT型的值):
intcount =
db.CaseInformation.Update(new{ typename = typenameval }, (p => p.typeid ==typeidval && p.pid == pidval && p.treetype ==treetypeval));//執(zhí)行更新,并返回進(jìn)行更新的記錄數(shù)。
6.4刪除-delete(返回一個(gè)INT型的值)
intcount =
db.CaseInformation.Delete(p => p.typeid == typeidval && p.pid ==
pidval && p.treetype == treetypeval);//執(zhí)行刪除操作,并返回刪除記錄的數(shù)量
6.5多表聯(lián)合查詢
先搞明白表與表之間的映射關(guān)系,是一對(duì)一,還是多對(duì)一,或者一對(duì)多;
然后使用include語(yǔ)句立即加載針對(duì)特定關(guān)系檢索的對(duì)象;
接著輸出指定查詢信息。
varvlist = db.CASEINFO.Include(e => e.CaseType).Where(c
=> c.DOCID == docid).Select(c =>newCaseDetail()
{
DOCID = c.DOCID,
typename =c.CaseType.TYPENAME
}).ToList();//通過(guò)docid查詢對(duì)應(yīng)的案件記錄,并將序列中的每個(gè)元素投射到新表中
7.注意事項(xiàng)
1)一定要如下設(shè)置異常信息捕捉,以便于查看BUG原因?。?!
catch(Exceptionex)//異常信息
{
hd.Msg = ex.ToString();//數(shù)據(jù)庫(kù)自帶的異常信息
returntype.Json(resp, hd,null);//返回JSON格式結(jié)果集
}
2)入?yún)⒃诒碇惺鞘裁搭愋?,就設(shè)置為對(duì)應(yīng)類型,不要擅自改動(dòng)?。?!
8.在IIS上發(fā)布出來(lái)
1)添加網(wǎng)站
2)設(shè)置權(quán)限
3)添加默認(rèn)文檔
4)選擇網(wǎng)站對(duì)應(yīng)的應(yīng)用程序池,右鍵-高級(jí)設(shè)置:,接著設(shè)置“啟用32位應(yīng)用程序”為true,點(diǎn)擊確定