1.前提概述

ORM对象关系映射(Object-Relational Mapping)是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。ORM提供了概念性的、易于理解的模型化数据的方式。ORM方法论基于三个核心原则:

  1. 简单:以最基本的形式建模数据。
  2. 传达性:数据库结构被任何人都能理解的语言文档化。
  3. 精确性:基于数据模型创建正确标准化的结构。---摘自百度百科       ORM把数据库中的表映射成对象,更好的方便我们业务逻辑的处理。其底层还是基于ADO.NET。

2.创建过程

废话不多说,还是直接看步骤

1.打开VS2017,新建ASP.NET WEB应用程序(.NET Framework),跨平台可以选择.NET Core程序。

2.单击确定,下一步在模板中选择MVC模板。基于项目需求也可选择其他模板。

3. 项目创建后,新建类库(.NET Framwork)-MODEL层

4.在新建的MODEL中右击引用选择 管理NuGet程序包(N)...,在界面中选择浏览,搜索 linq2db 和 linq2db.SqlServer 分别安装,如果其他数据库则选择相应的linq2db对应类库。

5.安装完成后项目会在Model层下自动创建了文件夹 LinqToDB.Templates 文件夹,打开文件夹,将其中 CopyMe.SqlServer.tt.txt 文件拷贝出来放在类库下并修改名称,后缀改为.tt   由于我连接的数据库是XqtSaas,  所以我重命名为XqtSaas.tt   打开这个模板文件 将其中的 NamespaceName = "你项目的命名空间"  LoadSqlServerMetadata("你数据库的服务器IP或者实例", "连接的数据库", "连接数据库账号", "连接数据库密码");

6.配置好你的命名空间喝数据库信息后,项目会自动生成你的数据库模型,也可以每次 选中该 .tt 文件,右击运行自定义工具 运行完即生成了该库下面的所有表的实体,可以展开.tt文件,打开.generated.cs文件查看生成的数据库表模型。每次修改表模型后只要重新运行该自定义工具,即可更新对应的模型实体。

7.项目大家完成后,接下来我们来做个数据表,操作,把最基本的增删改查实现。可以新建业务层类库和数据层类库

注意: 1.新建的业务层类库 BLL和数据层类库DAL  可以通过泛型T定义业务层基类DataBaseBLL<T>和数据层基类DataBaseDAL<T> 定义统一的公用方法

2.新建的业务层类库 BLL和数据层类库DAL需要引用 Linq2Db 类库

3.每个方法需要加入 using (XqtSaasDB db = new XqtSaasDB(configName))     XqtSaasDB就是.tt文件生成的基类

config  就是你Web.Config连接数据库字符串的name值 protected readonly string configName = "BaseDB";

7.1  DataBaseBLL<T>代码如下

  1 using LinqToDB;
2 using LinqToDB.Data;
3 using Model;
4 using System;
5 using System.Collections.Generic;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9
10
11 namespace BLL
12 {
13 public class DataBaseBLL<T> where T : class
14 {
15 protected readonly string configName = "BaseDB";
16
17 public List<T> GetList()
18 {
19 try
20 {
21 using (XqtSaasDB db = new XqtSaasDB(configName))
22 {
23 return db.GetTable<T>().ToList();
24 }
25 }
26 catch (Exception ex)
27 {
28
29 throw;
30 }
31 }
32
33 public T GetById(long id)
34 {
35 using (XqtSaasDB db = new XqtSaasDB(configName))
36 {
37 var property = typeof(T).GetProperties().FirstOrDefault(_ => _.GetCustomAttributes(typeof(LinqToDB.Mapping.PrimaryKeyAttribute), false).Length > 0);
38 return db.GetTable<T>().FirstOrDefault(_ => Sql.Property<object>(_, property.Name).Equals(id));
39 }
40 }
41
42 public bool Insert(T t)
43 {
44 using (XqtSaasDB db = new XqtSaasDB(configName))
45 {
46 try
47 {
48 var id = db.InsertWithIdentity(t);
49 var property = typeof(T).GetProperties().FirstOrDefault(_ => _.GetCustomAttributes(typeof(LinqToDB.Mapping.PrimaryKeyAttribute), false).Length > 0);
50 if (id != null)
51 {
52 object value = Convert.ChangeType(id, property.PropertyType);
53 property.SetValue(t, value);
54 return true;
55 }
56 return false;
57 }
58 catch (Exception ex)
59 {
60 throw ex;
61 }
62 }
63 }
64
65 public void Insert(IEnumerable<T> list)
66 {
67 using (XqtSaasDB db = new XqtSaasDB(configName))
68 {
69 db.BulkCopy(list);
70 }
71 }
72
73
74 public bool Update(T t)
75 {
76 using (XqtSaasDB db = new XqtSaasDB(configName))
77 {
78 return db.Update(t) > 0;
79 }
80 }
81
82 public bool Delete(T t)
83 {
84 using (XqtSaasDB db = new XqtSaasDB(configName))
85 {
86 return db.Delete(t) > 0;
87 }
88 }
89
90 public bool Delete(int Id)
91 {
92 using (XqtSaasDB db = new XqtSaasDB(configName))
93 {
94 var property = typeof(T).GetProperties().FirstOrDefault(_ => _.GetCustomAttributes(typeof(LinqToDB.Mapping.PrimaryKeyAttribute), false).Length > 0);
95 return db.GetTable<T>().Where(_ => Sql.Property<object>(_, property.Name).Equals(Id)).Delete() > 0;
96 }
97 }
98
99 public bool Exists(Func<T, bool> predicate)
100 {
101 using (XqtSaasDB db = new XqtSaasDB(configName))
102 {
103 return db.GetTable<T>().Where(predicate).Count() > 0;
104 }
105 }
106 }
107 }

  7.2  DataBaseDAL<T> 代码如下

  1 using LinqToDB;
2 using LinqToDB.Common;
3 using LinqToDB.Data;
4 using Model;
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8 using System.Text;
9 using System.Threading.Tasks;
10
11
12 namespace DAL
13 {
14 public abstract class DataBaseDAL<T> where T : class
15 {
16 protected readonly string configName = "BaseDB";
17
18 public List<T> GetList()
19 {
20 try
21 {
22 using (XqtSaasDB db = new XqtSaasDB(configName))
23 {
24
25 return db.GetTable<T>().ToList();
26 }
27 }
28 catch (Exception ex)
29 {
30
31 throw ex;
32 }
33
34 }
35
36
37 public T GetById(object id)
38 {
39 using (XqtSaasDB db = new XqtSaasDB(configName))
40 {
41 var property = typeof(T).GetProperties().FirstOrDefault(_ => _.GetCustomAttributes(typeof(LinqToDB.Mapping.PrimaryKeyAttribute), false).Length > 0);
42 return db.GetTable<T>().FirstOrDefault(_ => Sql.Property<object>(_, property.Name).Equals(id));
43 }
44 }
45
46
47 public T Excute(string sql)
48 {
49 try
50 {
51 using (XqtSaasDB db = new XqtSaasDB(configName))
52 {
53 return db.Execute<T>(sql);
54 }
55 }
56 catch (Exception ex)
57 {
58
59 throw ex;
60 }
61
62 }
63
64
65 public List<X> Qeury<X>(string sql)
66 {
67 try
68 {
69 using (XqtSaasDB db = new XqtSaasDB(configName))
70 {
71 return db.Query<X>(sql).ToList();
72 }
73 }
74 catch (Exception ex)
75 {
76
77 throw ex;
78 }
79
80 }
81
82
83 public bool Insert(T t)
84 {
85
86 using (XqtSaasDB db = new XqtSaasDB(configName))
87 {
88 try
89 {
90 var id = db.InsertWithIdentity(t);
91 var property = typeof(T).GetProperties().FirstOrDefault(_ => _.GetCustomAttributes(typeof(LinqToDB.Mapping.PrimaryKeyAttribute), false).Length > 0);
92 if (id != null)
93 {
94 object value = Convert.ChangeType(id, property.PropertyType);
95 property.SetValue(t, value);
96 return true;
97 }
98 return false;
99 }
100 catch (Exception ex)
101 {
102 return false;
103 }
104
105
106 }
107 }
108
109
110 public void Insert(IEnumerable<T> list)
111 {
112 using (XqtSaasDB db = new XqtSaasDB(configName))
113 {
114 db.BulkCopy(list);
115 }
116 }
117
118
119 public bool Update(T t)
120 {
121 using (XqtSaasDB db = new XqtSaasDB(configName))
122 {
123 return db.Update(t) > 0;
124 }
125 }
126
127 public bool Delete(T t)
128 {
129 using (XqtSaasDB db = new XqtSaasDB(configName))
130 {
131 return db.Delete(t) > 0;
132 }
133 }
134
135 public bool Delete(int Id)
136 {
137 using (XqtSaasDB db = new XqtSaasDB(configName))
138 {
139 var property = typeof(T).GetProperties().FirstOrDefault(_ => _.GetCustomAttributes(typeof(LinqToDB.Mapping.PrimaryKeyAttribute), false).Length > 0);
140 return db.GetTable<T>().Where(_ => Sql.Property<object>(_, property.Name).Equals(Id)).Delete() > 0;
141 }
142 }
143 }
144
145 public class AllowMultipleQuery : IDisposable
146 {
147 public AllowMultipleQuery()
148 {
149 Configuration.Linq.AllowMultipleQuery = true;
150 }
151
152 public void Dispose()
153 {
154 Configuration.Linq.AllowMultipleQuery = false;
155 }
156 }
157 }

8.在web层新建区域test并且新建控制器UserController  并且在User视图中添加Index视图  并在BLL层下新建Hr_EmpBLL  在DAL层下新建 Hr_EmpDAL 代码如下

8.1 Index.cshtml 视图层

 1 @{
2 ViewBag.Title = "Index";
3 Layout = null;
4 }
5
6 <html>
7 <head>
8 <title>运营管理平台</title>
9 <meta charset="utf-8" />
10 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11 <script src="~/Scripts/jquery-1.9.1.min.js"></script>
12 <script type="text/javascript">
13 //获得用户列表
14 function GetUserList() {
15 var config = {
16 url: '/User/GetUserList',
17 type: 'post',
18 dataType: 'json',
19 //data: { UserName: LoginName, Password: LoginPwd, VerCode: VerCode },
20 success: function (result) {
21 //var list = JSON.parse(result);
22 console.info(result);
23 var html = "";
24 $.each(result, function (index, items) {
25 html += "<li>" + items.EmpCode + ":" + items.RealName + "</li>";
26 });
27 $("#DivUserList").html(html);
28 },
29 fail: function () {
30 }
31 };
32 $.ajax(config);
33 }
34
35 //根据用户编号获得用户信息
36 function GetUserByEmpCode() {
37 var EmpCode = $("#txxEmpCode").val();
38 var config = {
39 url: '/User/GetUserById',
40 type: 'post',
41 dataType: 'json',
42 data: { EmpCode: EmpCode },
43 success: function (result) {
44 //var list = JSON.parse(result);
45 console.info(result);
46 var html = "";
47
48 html += "<li>" + result.EmpCode + ":" + result.RealName + "</li>";
49
50 $("#DivUser").html(html);
51 },
52 fail: function () {
53 }
54 };
55 $.ajax(config);
56 }
57 </script>
58 </head>
59 <body>
60 <input type="button" value="获得用户列表" onclick="GetUserList()" />
61 <ul id="DivUserList"></ul>
62 <br />
63 用户编号:<input type="text" id="txxEmpCode" />
64 <input type="button" value="根据用户编号获得用户信息" onclick="GetUserByEmpCode()" />
65 <ul id="DivUser"></ul>
66 </body>
67 </html>
68

8.2  Hr_EmpBLL  代码    视图层调用两个方法   获取用户列表和根据用户编号获得单个用户,前一个方法直接调用基类中方法,故不需要写,后一个基类没有,需要扩展在BLL中写方法

 1 using DAL;
2 using Model;
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8
9 namespace BLL
10 {
11 public class Hr_EmpBLL:DataBaseBLL<HrEmp>
12 {
13 public HrEmp GetUserById(string EmpCode)
14 {
15 Hr_EmpDAL dal = new Hr_EmpDAL();
16 return dal.GetUserById(EmpCode);
17 }
18 }
19 }

8.3    Hr_EmpDAL 代码  视图层调用两个方法   获取用户列表和根据用户编号获得单个用户,前一个方法直接调用基类中方法,故不需要写,后一个基类没有,需要扩展在DAL中写方法

 1 using Model;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace DAL
9 {
10 public class Hr_EmpDAL:DataBaseDAL<HrEmp>
11 {
12 public HrEmp GetUserById(string EmpCode)
13 {
14 using (XqtSaasDB db = new XqtSaasDB(configName))
15 {
16 HrEmp query = db.HrEmps.FirstOrDefault(x => x.EmpCode.Equals(EmpCode)) ?? new HrEmp();
17 return query;
18 }
19 }
20 }
21 }

8.4  运行效果  1.获取用户列表

2.通过用户编号获得用户实体

3.最后结语

曾经用这个项目做了一个培训系统,Linq2Db 用起来还是很方便的

1.通过T4模板编译,设置好连接的数据库及命名空间自动生成每个表的实体,一旦表字段更改也可重新编译生成最新的表实体

2.Linq2Db轻量级的ORM项目搭建也比较简单

3.在性能上要弱于ADO但相比EF要快些。

第一次写博客园文章,还需要慢慢学习。有什么不对的,还望提醒。路漫漫其修远兮,吾将上下而求索

VS2017新建MVC+ORM中的LinqDb访问数据库项目的更多相关文章

  1. Entity FrameWork 中使用Lambda访问数据库性能优化

    在使用Entity Framework 访问数据库时,我们经常使用Lambda表达式,但是如果不小心的话,很容易就掉到坑里了.比如下面的例子:用Lambda访问MSSqlServer中的NewsInf ...

  2. Python中通过cx_Oracle访问数据库遇到的问题总结

    以下是Python中通过cx_Oracle操作数据库的过程中我所遇到的问题总结,感谢我们测试组的前辈朱勃给予的帮助最终解决了下列两个问题:     1)安装cx_Oracle会遇到的问题:在Windo ...

  3. Spring Boot中使用JdbcTemplate访问数据库

    本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...

  4. 2017.11.12 web中JDBC 方式访问数据库的技术

    JavaWeb------ 第四章 JDBC数据库访问技术 在JavaWeb应用程序中数据库访问是通过Java数据库连接(JavaDateBase Connectivity简称JDBC)数据库的链接一 ...

  5. 2014-07-30 MVC框架中对SQL Server数据库的访问

    今天是在吾索实习的第16天.我自己主要学习了基于MVC框架的系统的开发时,对SQL Server数据库的相关访问.其步骤如下: 第一步,在Models文件夹中创建一个类,并命名为Movies.cs,如 ...

  6. ASP.NET MVC+Entity Framework 4.1访问数据库

    Entity Framework 4.1支持代码优先(code first)编程模式:即可以先创建模型类,然后通过配置在EF4.1下动态生成数据库. 下面演示两种情形: 1.代码优先模式下,asp.n ...

  7. 在datasnap 中使用unidac 访问数据(服务器端)

    从delphi 6 开始,datasnap 作为delphi 自带的多层框架,一直更新到最新的delphi 10.3 .同时逐步增加了很多新的功能 ,比如支持REST 调用,支持 IIS ,apach ...

  8. 在Golang中如何正确地使用database/sql包访问数据库

    本文记录了我在实际工作中关于数据库操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上的东西,所以希望能抛砖引玉,也算是对这个问题的一次总结. 其实我也是一个新手,机缘巧合 ...

  9. 使用JdbcTemplate访问数据库

    参考源端:https://blog.csdn.net/liaodehong/article/details/76974827 今天用Spring Boot访问一下数据库,并且把数据返回到页面中,进行增 ...

随机推荐

  1. 正式班D8

    2020.10.15星期四 正式班D8 一.上节课复习 OSI七层协议 socket socket是对传输层以下的封装 IP+port标识唯一一个基于网络通讯的软件 TCP与UDP TCP:因为在通信 ...

  2. 经典剪枝算法的例题——Sticks详细注释版

    这题听说是道十分经典的剪枝算的题目,不要问我剪枝是什么,我也不知道,反正我只知道用到了深度搜索 我参考了好多资料才悟懂,然后我发现网上的那些大神原理讲的很明白,但代码没多少注释,看的很懵X,于是我抄起 ...

  3. Java异常ClassCastException

    在说ClassCastException之前,先介绍下引用类型转换: 引用类型转换分为向上转型和向下转型两种: 向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的:当父类引用指向一 ...

  4. 1. Deep Q-Learning

    传统的强化学习算法具有很强的决策能力,但难以用于高维空间任务中,需要结合深度学习的高感知能力,因此延展出深度强化学习,最经典的就是DQN(Deep Q-Learning). DQN 2013 DQN的 ...

  5. Nginx的正向代理-反向代理-负载均衡

      正向代理与反向代理[总结]   1.前言 最近工作中用到反向代理,发现网络代理的玩法还真不少,网络背后有很多需要去学习.而在此之前仅仅使用了过代理软件,曾经为了访问google,使用了代理软件,需 ...

  6. JavaScript实现基于数组的栈

    class StackArray {   constructor() {     this.items = [];   }   push(element) {     this.items.push( ...

  7. 正则表达式小应用之对xml格式字符串每个字段加双引号

    通过Python对接口进行自动化后需要把xml格式的报文放到LoadRunner上进行压力测试,在pyCharm控制台打印出报文后,把报文放到LoadRunner中做了格式调整后,每个字段需要添加双引 ...

  8. 容器探针(liveness and readiness probe)

    一.为什么需要容器探针 如何保持Pod健康   只要将pod调度到某个节点,Kubelet就会运行pod的容器,如果该pod的容器有一个或者所有的都终止运行(容器的主进程崩溃),Kubelet将重启容 ...

  9. Learn day2 运算/循环/字符串操作

    1.容器类型的强制转换 类型:str list tuple set dict var1 = "今天天气好晴朗朗"var2 = ["刘璐","王钊&qu ...

  10. pip install kaggle 出现 【网络不可达】?

    解决办法: pip install kaggle -i http://pypi.douban.com/simple --trusted-host pypi.douban.com