dotnet core 数据库

程序开发过程中,需要使用数据对数据进行存储,分析等。通常而言都会使用ORM来实现关系数据库与实体对象的转化,过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

ORM

ORM是实现持久化层的一种常用的方式,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。常用的ORM有Dapper,EF,NPOCO等。选择ORM我一般关注一下几点:

Dapper EF NPOCO
简单表映射 Y Y Y
侵入性 N Y N
LINQ访问 N Y Y
SQL语句 Y Y Y
多数据库 Y Y Y
日志 Y N Y
性能 一般

通过一些简单的比较,个人比较在意日志,LINQ使用,侵入性等性质,所以选择NPOCO作为ORM工具。

安装

这里使用MySQL数据库存储,首先安装对应的依赖包,使用NuGet安装如下包

NPoco 3.5.0

MySql.Data 7.0.7-m61

安装完成后进行相应还原,为了方便的使用NPOCO中原有的数据操作并进行一些扩展,使用CachedDataAccess继承NPOCO中的Database操作类,代码如下:

public class CachedDataAccess : Database
{ }

配置

在appsettings.json文件中配置连接字符串示例如下:

{
"ConnectionStrings": {
"DefaultConnection": "server=127.0.0.1;userid=xxx;pwd=xxx;port=3306;database=demo;sslmode=none;Allow Zero Datetime=True;Convert Zero Datetime=True;"
}
}

在CachedDataAccess使用静态构造获取对应的连接字符串,并利用默认的构造函数初始换对应的连接,这样就可以使用默认构造来初始化使用数据库。

public class CachedDataAccess : Database
{
protected static IConfigurationRoot Configuration { get; }
protected static string connection { get; set; }
private ILogger _logger = Log.Logger;
static CachedDataAccess()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
Configuration = builder.Build();
connection = Configuration.GetConnectionString("DefaultConnection");
} public CachedDataAccess() : base(connection, DatabaseType.MySQL, MySql.Data.MySqlClient.MySqlClientFactory.Instance)
{ }
}

操作

使用NPOCO的常用的数据库操作及使用

事务

using (var db = new CachedDataAccess())
{
db.BeginTransaction();
//Your CRUD operation here
db.CompleteTransaction();
}

增加

public class MIKO_ACCOUNT
{
public int ID { get;set; }
public string ACCOUNT { get;set; };
} using (var cda = new CachedDataAccess())
{
var item = new MIKO_ACCOUNT();
item.ACCOUNT = "demo"; cda.BeginTransaction();
cda.Insert(item);
cda.CompleteTransaction();
}

删除

using (var cda = new CachedDataAccess())
{
cda.BeginTransaction();
cda.Delete<MIKO_ACCOUNT>(p=>p.ACCOUNT == "demo");
cda.CompleteTransaction();
}

查询

using (var cda = new CachedDataAccess())
{
cda.BeginTransaction();
var items = cda.Query<MIKO_ACCOUNT>().Where(p=>p.ACCOUNT == "demo");
cda.CompleteTransaction();
}

修改

using (var cda = new CachedDataAccess())
{
cda.BeginTransaction();
var user = cda.Query<MIKO_ACCOUNT>().Where(p=>p.ACCOUNT == "demo").FirstOrDefault();
user.ACCOUNT = "new@domain.com";
db.Update(user);
cda.CompleteTransaction();
}

日志

日志记录对跟踪错误及统计有很重要的意义,NPOCO中可以采用手工重写OnExecutingCommand,OnException方法来实现日志的记录。简单的实现代码如下,其中

private ILogger _logger = Log.Logger;

protected override void OnExecutingCommand(DbCommand cmd)
{
this._logger.Information(FormatCommand(cmd));
} protected override void OnException(Exception exception)
{
this._logger.Error(exception.Message);
}

我们执行一个上面的查询语句,在日志中可以看到对应的查询记录如下

2017-06-24 19:55:48.589 +08:00 [Information] SELECT `M`.`ID` as `ID`,  `M`.`ACCOUNT` as `ACCOUNT`,
FROM `MIKO_ACCOUNT` `M`
WHERE (`M`.`ACCOUNT` = @0)
-> @0 [String] = "demo"

dotnet core 数据库的更多相关文章

  1. 用dotnet core搭建web服务器(三)ORM访问数据库

    访问传统sql数据库,大家以前都是用sql语句去查询.这些年流行orm方法 ORM是对象关系映射的简拼,就是用一个对象(class)去表示数据的一行,用对象的成员去表述数据的列 dotnet 官方很早 ...

  2. dotnet core 使用 MongoDB 进行高性能Nosql数据库操作

    好久没有写过Blog, 每天看着开源的Java社区流口水, 心里满不是滋味. 终于等到了今年六月份 dotnet core 的正式发布, 看着dotnet 社区也一步一步走向繁荣, 一片蒸蒸日上的大好 ...

  3. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

  4. 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)

    作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ...

  5. [翻译 EF Core in Action 2.3] 理解EF Core数据库查询

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  6. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...

  7. DotNet和DotNet Core

    EF 1.0 ---EF6.0 都是code firstmodel ,model model first model,database first model, EF7 是DOTNET CORE重框版 ...

  8. 国产中标麒麟Linux部署dotnet core 环境并运行项目 (二) 部署运行控制台项目

    背景 在上一篇文章安装dotnet core,已经安装好dotnet core了.之前只是安装成功了dotnet, 输入dotnet --info,可以确认安装成功了,但是在运行代码时,还是报错了,本 ...

  9. devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务

    使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...

随机推荐

  1. mysql 5.7版本如何修改密码

    这是官方截图,mysql5.7安装后,会有一个默认密码,保存在mysql.log里面,找的他,并更改 官方文档地址 https://dev.mysql.com/doc/refman/5.7/en/li ...

  2. LAB2 软件测试 Selenium上机实验 2017

    1.安装SeleniumIDE插件 打开Firefox——>菜单栏——>附加组件——>获取附加组件——>查看更多附加组件——>搜索框输入SeleniumIDE并查找——& ...

  3. SAP成都研究院廖婧:SAP C4C社交媒体集成概述

    曾经有朋友在知乎上向我提问,咨询在SAP成都研究院工作的体验. 当时,我的回答提到一点,SAP注重工作与生活的平衡,这也是SAP中国官网强调的一点. https://www.sap.com/china ...

  4. Android(java)学习笔记20:UDP协议发送数据

    1. UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: package cn.itcast_02; import java.io.IOException; import java.net ...

  5. Android4.4 ContentResolver查询图片无效 及 图库删除 添加图片后,ContentResolver不更新的问题解决

    问题背景: 參考链接 做了一个图片浏览,用ContentResolver扫描图库照片.且严格依照时间拍摄顺序排好序显示在listview里.例如以下图所看到的: watermark/2/text/aH ...

  6. Gym - 101334E 多叉树遍历

    题意:给定一个字符串,求有多少种树与之对应,对应方式是,每次遍历左节点,没有了,就回溯: 分析:d[i,j] = sum(d[i+1,k-1],d[k,j]) (str[i]==str[k]); 坑点 ...

  7. Manacher算法模板

    题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格 ...

  8. ES6学习笔记(对象)

    1.属性的简洁表示法 const foo = 'bar'; const baz = {foo}; baz // {foo: "bar"} // 等同于 const baz = {f ...

  9. JavaScript js调用堆栈(一)

    本文主要介绍JavaScript程序内部的执行机制 首先先了解什么是执行上下文 执行上下文就是当前JavaScript代码被解析和执行是所在环境的抽象概念,JavaScript中运行任何的代码都是在执 ...

  10. rest_framework -- mixins&generics

    上面的mixins.generics都是rest_framework里的模块,我们可以继承其中的某些类,达到代码量减少的效果,这里充分体现出了面向对象的继承 一.mixins模块 mixins : f ...