ORM
=> 对象关系映射(英语:Object Relational Mapping)对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。
ORM框架
用途 => 为了解决 软件项目
与 数据库
打交道的中间层。
1.EntityFramework
可以直接写LINQ & Limbda语法,使用最为广泛,是有三种模式
Database First模式(在Oracle中不好用,因为会把Number(1)转成bool类型,很麻烦)
“数据库优先”,前提已有数据库表,根据表结构自动生成model,可以在Visual Studio模型设计器修改这些模型之间对应关系。
Model First模式
“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在Visual Studio中我们通过设计对于的数据模型来生成数据库和数据类。
已有数据库和表,借住第三方工具(比如动软代码生成器)生成对应的Model,更新数据库表的时候需要手动更新项目中的Model。
Code First模式
“代码优先”模式,有两种方式。
此时没有对应数据库和表,自己创建Model,在Nuget包管理器->程序包管理器控制台执行命令update-database生成数据库和表格。(前提是config文件中有对应的connectionStrings)。
这样设计的好处是可以针对概念模型进行所有数据操作而不必关系数据的存储关系,可以更加自然的采用面向对象的方式进行面向数据的应用程序开发
2.Dapper
常用于.NET Core的程序中,优点是免费,效率高,更加小巧轻便,可以直接写SQL,甚至可以写多条SQL,但是参数与返回值要好好处理,尤其是返回值,对于返回多个不同List的结果比较难处理。
Dapper是通过对IDbConnection接口的扩展来操作数据库的,速度方面拥有微型ORM之王的称号。
要安装Dapper的dll
using (var db = new SqlConnection(SqlDB.ConnectionStringLocalTransaction))
{
var res = await db.QueryAsync<QC_MaterialCategory>("SELECT * FROM QC_MaterialCategory WHERE Code=@Code", new { Code = code });
if (res.Count() > 0)
{
return res.ToList()[0];
}
}
//配置数据库连接
public static readonly string ConnectionStringLocalTransaction = GetConnection();
//从SQLConfig.xml文件读取连接配置
public static string GetConnection()
{
string conn = "";
if (System.Web.HttpContext.Current != null)
{
var ad = System.Web.HttpContext.Current.Server.MapPath("/SQLConfig.xml");
conn = Common.XMLHelper.GetXmlNodeByXpath(System.Web.HttpContext.Current.Server.MapPath("/SQLConfig.xml"), "//SQLConfig//add[@key='PfMD']").Attributes["value"].Value;
//conn = "Server =MW-J7YN957M9B7Q+'\'+MSSQLSERVER2012; Database = SOADB; User Id = sa; Password = sasa;";
}
else
{
conn = Common.XMLHelper.GetXmlNodeByXpath(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "SQLConfig.xml"), "//SQLConfig//add[@key='PfMD']").Attributes["value"].Value;
}
return conn;
}
Dapper.Query(SQL)
Dapper.Execute(SQL,变量,事务,执行超时的时间,类型)
第二个参数-变量:DynamicParameters,可以把变量添加进去然后在sql语句中用@取出来用。
第三个参数:CommandType 指明是SQL语句还是存储过程
整体写法如
3.DButility
DButility下面有个SqlDB的Class
可以用 SqlDB.Query(sql) 执行查询语句,返回的是DataTable类型
用SqlDB.ExecuteNonQuery(sql) 执行增删改,返回的是受影响的行数
用法如下:
string sqlA = "SELECT * from ScanPlanTime where ContractNo='{0}'"; --SQL语句,其中{0}是下面Format语句中的参数顺序
sqlA = string.Format(sqlA, ContractNo);
dt_Exists = SqlDB.Query(sqlA).Tables[0]; 执行sqlA
EF和 Dapper简单对比
EF常用于EntityFramWork框架的解决方法,而Dapper更常用于.NET Core框架的解决方案
1.从语法来看,EF支持Linq语法,书写更加快捷,且有IDE帮忙验错,更易排查错误。而Dapper更倾向于SQL。
另外书写SQL语句时尽量不要用拼接字符串的形式组SQL,因为有被攻击或者SQL注入的风险,尽量用StringBulder。
StringBuilder sql = new StringBuilder();
sql.AppendLine("SELECT TPC.*,S.SamplePlan,TP.Name AS TestName FROM QC_TestProjectConfig TPC ");
sql.AppendLine("LEFT JOIN QC_Sampling S ON TPC.SampleId=S.Id ");
sql.AppendLine("LEFT JOIN QC_TestProject TP ON TPC.TestId=TP.Id ");
sql.AppendLine("WHERE 1=1 ");
sql.AppendLine("AND (TPC.StationName LIKE @StationName OR @StationName= NULL) ");
sql.AppendLine("AND (TPC.InspectionType LIKE @InspectionType OR @InspectionType= NULL) ");
sql.AppendLine("AND (S.Id like @SampleId OR @SampleId=null) ");
sql.AppendLine("AND (TP.Id LIKE @TestId OR @TestId=NULL) ");
using (var db = new SqlConnection(SqlDB.ConnectionStringLocalTransaction))
{
var list = await db.QueryAsync<QC_TestProjectConfig>(sql.ToString(), new { StationName = string.Format("%{0}%", filter.StationName), InspectionType = string.Format("%{0}%", filter.InspectionType), SampleId = string.Format("%{0}%", filter.SampleId), TestId = string.Format("%{0}%", filter.TestId) });
return list.ToList();
}
2.Dapper更轻量,更高效,对于数据库比较简单的使用Dapper更方便。
3.同时使用EF或Dapper做数据请求时,通过SQL Server里面的 Profiler(分析器)来追踪请求可以发现 Dapper请求时生成的SQL语句比EF生成的SQL语句更简单。