一、概述
平台:VS2015
语言:C#
技术:ELINQ
数据库:ORACLE
成果:一个能实现对数据库中的表进行增删改查功能的接口
接口返回的结果:JSON格式的结果集
二、流程
1.添加网站,新建一个web服务。
2.添加引用:System.Data.OracleClient;通过Nuget安装ELinq包和Newtonsoft.Json包;
3.配置数据库连接信息。在Web.config文件中添加连接字符串:
4.先添加实体类,在其中添加命名空间:using Nlite.Data;并映射数据库中的表,原则上实体类名要和表名一致或遵循一定规律。例如casetype类(映射Oracle数据库中的s_casetype表):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLite.Data;
///
/// casetype的摘要说明
///
[Table("s_casetype")]
public class casetype
{
///
///案件类型代码
///
[Id]
publicstring typeid { get; set; }
///
///父类的代码
///
publicstring pid { get; set; }
///
///案件类型名称
///
publicstring typename { get; set; }
///
///说明
///
publicstring remark { get; set; }
///
///树类型,0是事件,1是部件
///
publicstring treetype { get; set; }
///
///区级TYPEID
///
publicstring qtypeid { get; set; }
}
其次,添加一个展示指定输出信息的类。例如caseinfo类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
///
/// CaseInfo的摘要说明,用于输出的类
///
public class CaseInfo
{
///
///案件代码
///
publicstring typeid { get; set; }
///
///父类的案件代码
///
publicstring pid { get; set; }
///
///案件类型名称
///
publicstring typename { get; set; }
///
///案件说明
///
publicstring remark { get; set; }
///
///树类型,0是事件,1是部件
///
publicstring treetype { get; set; }
///
///区级TYPEID
///
publicstring qtypeid { get; set; }
}
接着添加了HeadData类,返回操作成功与否的信息;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
///
/// HeadData的摘要说明
///返回操作是否成功的提示信息
///
public class HeadData
{
///
///一个返回值,0表示成功
///
publicint Code { get; set; }
///
///错误的信息
///
privatestring mMsg = "";
///
///错误信息
///
publicstring Msg { get { return mMsg; } set { mMsg = value; } }
privateDateTime mServerTime = DateTime.Now;
///
///返回服务器时间
///
publicDateTime ServerTime { get { return mServerTime; } set { mServerTime = value; }}
///
///返回结果的数量
///
publicint Count { get; set; }
///
///业务逻辑处理结果
///
publicbool Result { get; set; }
}
public enum codetype
{
///
///执行成功
///
CODE_OK = 0,
///
///执行失败
///
CODE_ERROR = 1
}
再添加Returntype类,以JSON格式返回结果集。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
///
/// returntype的摘要说明
///
public class returntype
{
publicstatic void Json(HttpResponse Resp, HeadData head, object data)
{
if (string.IsNullOrEmpty(Resp.ContentType)) //为啥要判断一下?
{
Resp.ContentType = "text/json";
}
object objData = new//输出的内容详情
{
Code = head.Code,
Errmsg = head.Msg,
ServerTime = head.ServerTime,
Result = head.Result,
Count = head.Count,
Data = data
};
//设置时间格式
IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); //实例化一个标准数据时间格式的对象
timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";//指定输出的时间格式
IList converts = new List(); //初始化实例,表示可按照索引单独访问的一组对象,转换对象为JSON,没懂?
converts.Add(timeFormat);//添加时间格式,没懂?
//设置输出语句
Resp.Write(JsonConvert.SerializeObject(objData, Newtonsoft.Json.Formatting.None,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters =converts
}));//将字符串写如HTTP响应输出流,JsonConvert类提供.NET和JSON类型转换的方法:SerializeObject方法(具体连载对象,默认格式,初始化一个JSON连载设置)
}
}
5.再添加SsisDbContext类,在这个类中连接数据库(创建DbConfiguration对象、设置SQL语句输出日志、注册实体到数据表的映射关系),然后创建DbSet对象(表示用于执行插入、读取、更新和删除操作的类型化实体集,对实体集的所有增删改查操作会立即同步到数据库对应的表中)。
5.1映射关系总结:
一对一:第一种是一对一主键关联,要求两个主键必须完全一致;第二种是一对一外键关联(未懂)。例子,一个球队对应一个地址。
一对多:例如,从球队角度来说,一个球队拥有多个球员
多对一:例如,从球员角度来说,多个球员属于一个球队
多对多:如学生与选修课之间的关系,一个学生可以选择多门选修课,每门选修课又可以被多名学生选择。一般是采用中间表的方式处理,转化为两个一对多。
代码示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLite;
using NLite.Data;
///
/// SsisDbContext的摘要说明
///
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);
});//设置SQL语句输出日志,注册实体到数据表的映射关系,从caseinfo的角度来说,caseinfomodel与casetypemodel是一对一的关系
publicSsisDbContext():base(dbConfig)//根据DbConfiguration创建DbContext的对象
{
//
// TODO:在此处添加构造函数逻辑
//ELinq
}
publicreadonly IDbSet CaseInformation;//表示用于执行插入、读取、更新和删除操作的类型化实体集,对实体集中所有的增删改查操作会立即同步到数据库对应的表中
publicreadonly IDbSet CASEINFO;
publicreadonly IDbSet CASETYPE;
}
6.主体代码编写(实现增删改查)
在using( SsisDbContext db = new SsisDbContext()) {}中写基于ELINQ技术的增删改查的语句。
6.1查询:
varquery= db.caseinformation.where(condition1 ).select(c=> new OutClass{ ….}).ToList();
其中where语句中写筛选条件,select语句将序列中的每个元素投影到新表中,tolist语句将表转换为集合
6.2插入-insert:
vara =newcasetype
{
typeid = typeidval,
pid = pidval,
typename =typenameval,
remark = remarkval,
treetype =treetypeval,
qtypeid =qtypeidval
};
db.CaseInformation.Insert(a);//插入语句
6.3更新修改-update(会返回一个INT型的值):
intcount =
db.CaseInformation.Update(new{ typename = typenameval }, (p => p.typeid ==typeidval && p.pid == pidval && p.treetype ==treetypeval));//执行更新,并返回进行更新的记录数。
6.4删除-delete(返回一个INT型的值)
intcount =
db.CaseInformation.Delete(p => p.typeid == typeidval && p.pid ==
pidval && p.treetype == treetypeval);//执行删除操作,并返回删除记录的数量
6.5多表联合查询
先搞明白表与表之间的映射关系,是一对一,还是多对一,或者一对多;
然后使用include语句立即加载针对特定关系检索的对象;
接着输出指定查询信息。
varvlist = db.CASEINFO.Include(e => e.CaseType).Where(c
=> c.DOCID == docid).Select(c =>newCaseDetail()
{
DOCID = c.DOCID,
typename =c.CaseType.TYPENAME
}).ToList();//通过docid查询对应的案件记录,并将序列中的每个元素投射到新表中
7.注意事项
1)一定要如下设置异常信息捕捉,以便于查看BUG原因!!!
catch(Exceptionex)//异常信息
{
hd.Msg = ex.ToString();//数据库自带的异常信息
returntype.Json(resp, hd,null);//返回JSON格式结果集
}
2)入参在表中是什么类型,就设置为对应类型,不要擅自改动!!!
8.在IIS上发布出来
1)添加网站
2)设置权限
3)添加默认文档
4)选择网站对应的应用程序池,右键-高级设置:,接着设置“启用32位应用程序”为true,点击确定