dotnet core 数据库

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"
posted @ 2017-06-26 21:32  S&L·chuck  阅读(1677)  评论(0编辑  收藏  举报