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"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM