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. 四、获取远程URL图片

    #!/usr/bin/python # -*- coding: UTF-8 -*- import re import urllib def getHtml(url): page = urllib.ur ...

  2. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  3. mongodb文档替换

    对下面的文档做一个比较大的调整,将 friends.enemies两个字段移到 relationships子文档中. > db.people.insert({ "name" ...

  4. python 用cookie模拟登陆网站

    import re import requests def get_info(url): headers = { "Cookie" :"***************** ...

  5. 动态规划(DP),类似LIS,FatMouse's Speed

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weig ...

  6. Catalan数列

    引入 今天听学长讲了卡特兰数列后对其有了更深的认识,在此完善了一下之前的博客加以总结. 首先用一个经典的例子来描述一下Catalan数列,我们有一个1~n的数列和一个大小为n的栈,我们有如下两种操作: ...

  7. 【转】netstat 命令当中的内部地址和外部地址分别代表的是什么?

    RT,用自己的话解释,不要搬网上的内容.尽量可以简洁,谢谢 2015-03-07 17:41 提问者采纳   网络连接是有2方参与,自己就是“内部地址”,别人就是“外部地址”,就这么简洁. 再举个例子 ...

  8. 记一次msfconsole_android渗透实验

    1>查看本机IP 2>生成App木马 3>将生成的木马安装至手机 4>打开msfconsole 1,  use exploit/multi/handler  加载模块. 2, ...

  9. 【洛谷P2470】[SCOI2007]压缩

    压缩 #include<iostream> #include<cstring> #include<cstdio> using namespace std; #def ...

  10. Entity Framework 三

    DbContext:上下文 EDM将生成从System.Data.Entity.DbContext类派生的SchoolDBEntities类,如下所示.派生DbContext的类在实体框架中被称为上下 ...