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. 持续集成工具之Jenkins pipline简单示例

    前文我们主要聊了下jenkins的插件安装.用户及权限管理.邮件发送.配置凭证到gitlab上拉取项目和创建普通job:回顾请参考https://www.cnblogs.com/qiuhom-1874 ...

  2. Mysql架构与内部模块-第二章

    接上文,上文简述到了Mysql中的查询缓存和解析器,今日我们继续. 先来看一段SQL:SELECT * FROM `jianghuadong`; 先假设我们数据库中并没有一张名为jianghuadon ...

  3. 提取swagger内容到csv表格,excel可打开

    swagger生成的页面api接口统计,有几种方法 直接在前端用js提取出来,较麻烦(不推荐,不同版本的页面生成的标签有可能不一样,因此可能提取不出来) //apilet a = document.g ...

  4. c++11 R+字符串

    R+字符串 prefix(optional) R"delimiter(raw_characters)delimiter" (6) (since C++11) C++11引入了原始字 ...

  5. selenium元素定位学习笔记

    一,定位原则 稳定 简单灵活 唯一 WebDriver提供了两种方式来定位页面元素,分别是find_element_by_XXX和find_elements_by_XXX.第一种方式的结果是在正常情况 ...

  6. MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨

    开心一刻 产品还没测试直接投入生产时,这尼玛... 背景问题 在讲 binlog 之前,我们先来回顾下主流关系型数据库的默认隔离级别,是默认隔离级别,不是事务有哪几种隔离级别,别会错题意了 1.Ora ...

  7. python执行 sql 语句

    写的很好 import pymysql conn = pymysql.connect(host = '127.0.0.1',port = 3306,user = 'root',passwd = '12 ...

  8. Idea启动报错 Error:java: System Java Compiler was not found in classpath

    报错信息:Error:java: System Java Compiler was not found in classpath 使用IDEA启动的时候出现了这个错误,查找了很久,才找到解决办法 1. ...

  9. E. Tree Reconstruction 解析(思維)

    Codeforce 1041 E. Tree Reconstruction 解析(思維) 今天我們來看看CF1041E 題目連結 題目 略,請直接看原題 前言 一開始完全搞錯題目意思,還以為每次會刪除 ...

  10. FFmpeg滤镜使用

    滤镜(filter)详细介绍参考官方文档. 常用的滤镜功能,像图像加水印/字幕.去logo.图形旋转缩放等,但滤镜不仅仅包括视频部分,还包括音频处理的,像变声变调.声场控制(重低音/留声机/摇滚等效果 ...