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"
