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. 【Leetcode】【Easy】Climbing Stairs

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  2. JS教程之实现加载图片时百分比进度

    思路:思路其实很简单,ajax执行时,会生成一个event对象,其中会包含要加载的文件的大小和当前已经加载完成部分的大小,通过这两个值即可计算出百分比 事件介绍onprogress 当浏览器正在加载媒 ...

  3. Orchard Core 文档翻译 (三) Orchard Core Modules

    原文连接:https://www.cnblogs.com/Qbit/p/9746442.html 转载请注明出处 介绍 Orchard Core Modules库提供了一种机制,可以拥有一个独立的模块 ...

  4. python入门16 递归函数 高阶函数

    递归函数:函数内部调用自身.(要注意跳出条件,否则会死循环) 高阶函数:函数的参数包含函数 递归函数 #coding:utf-8 #/usr/bin/python """ ...

  5. 统计一段文章的单词频率,取出频率最高的5个单词和个数(python)

    练习题:统计一段英语文章的单词频率,取出频率最高的5个单词和个数(用python实现) 先全部转为小写再判定 lower() 怎么判定单词? 1 不是字母的特殊字符作为分隔符分割字符串 (避免特殊字符 ...

  6. IOS AFN请求 总结

    一.2大管理对象 1.AFHTTPRequestOperationManager* 对NSURLConnection的封装 2.AFHTTPSessionManager* 对NSURLSession的 ...

  7. php-fpm 慢日志查询

    虽然可以通过 nginx 的 accesslog 日志查询到用户访问接口或网页消耗的时间,但是不能清晰的追踪到哪个文件或函数慢, 可以通过 php-fpm 慢日志查询检测 php 脚本运行状态,哪些 ...

  8. MYSQL5.7.15安装步骤

    下载完成之后双击安装: 接下来一路next (出现的问题) 在我第一次安装myslq过程中,上图中的mysql server failed ,这是因为电脑环境需要升级一个插件,Visual C++ 2 ...

  9. Javascript中==和===的区别

     一.JavaScript"=="的作用 1.当==两边的内容是字符串时,则比较字符串的内容是否相等. 2.当==两边的内容是数字时,则比较数字的大小是否相等. 3.当==两边的内 ...

  10. <jsp:include>和<%@include file=""%>的区别(简单了解)

    简单了解 include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,JSP引擎在判断JSP页面未被修改,否则视为已被修改.由于被包含的文件是在编译时才插入的 ...