天天看點

一個開源的ORM架構——Light.Data介紹如何使用

目錄

介紹

支援的資料庫

如何使用

資料庫配置

使用方法

對象映射

子表映射

基本操作

資料聚合

Join表查詢

執行SQL

單元測試

性能測試

介紹

Light.Data 是一個基于dotnet standard 2.0的輕量級ORM架構  ,通過實體模型類  Attribute 或配置檔案關聯資料表。使用核心類  DataContext 在表上進行  CURD 操作。

PM> Install-Package Light.Data
           

支援的資料庫

資料庫 介紹
SqlServer的 需要安裝  nuget 安裝  Light.Data.Mssql 庫,支援SqlServer 2008或以上版本
Mysql的 需要安裝  nuget 安裝  Light.Data.Mysql 庫,支援Mysql5.5或以上版本
Postgre 需要安裝  nuget 安裝  Light.Data.Postgre 庫,支援PostgreSQL9.3或以上版本
  • 檔案:https://aquilahkj.github.io/Light.Data.Site/
  • Github:https://github.com/aquilahkj/Light.Data2

如何使用

資料庫配置

{
  "lightData": {
      "connections": [
          {
             "name": "mssql_db",
             "connectionString": "...",
             "providerName": "Light.Data.Mssql.MssqlProvider, Light.Data.Mssql"
          },
          {
             "name": "mysql_db",
             "connectionString": "...",
             "providerName": "Light.Data.Mysql.MysqlProvider, Light.Data.Mysql"
           }
       ]
    }
}
           

使用方法

// direct use
DataContext context = new DataContext("mssql");

// create subclass
public class MyDataContext : DataContext
{
    public MyDataContext() : base("mssql")
    {

    }
}

// create subclass with options
public class MyDataContext : DataContext
{
    public MyDataContext(DataContextOptions<MyDataContext> options) : base(options)
    {

    }
}

// direct config connect string and params (IServiceCollection)
service.AddDataContext<MyDataContext>(builder => {
    builder.UseMssql(connectionString);
    builder.SetTimeout(2000);
    builder.SetVersion("11.0");
}, ServiceLifetime.Transient);

// use default configuration file to config (IServiceCollection)
service.AddDataContext<MyDataContext>(DataContextConfiguration.Global, config => {
       config.ConfigName = "mssql";
}, ServiceLifetime.Transient);
           

對象映射

[DataTable("Te_User", IsEntityTable = true)]
public class TeUser
{
    /// <summary>
    /// Id
    /// </summary>
    /// <value></value>
    [DataField("Id", IsIdentity = true, IsPrimaryKey = true)]
    public int Id
    {
        get;
        set;
    }

    /// <summary>
    /// Account
    /// </summary>
    /// <value></value>
    [DataField("Account")]
    public string Account
    {
        get;
        set;
    }

    /// <summary>
    /// Telephone
    /// </summary>
    /// <value></value>
    [DataField("Telephone", IsNullable = true)]
    public string Telephone
    {
        get;
        set;
    }
    ....
}
           

子表映射

在派生類TeUserAndExtend中添加類型為TeUserExtend的公共屬性Extend,并添加特性RelationFieldAttribute。在查詢TeUserAndExtend中,還将檢測關聯的TeUserExtend 資料。并且還支援一對多。

[DataTable("Te_UserExtend", IsEntityTable = true)]
public class TeUserExtend
{
    [DataField("Id", IsIdentity = true, IsPrimaryKey = true)]
    public int Id
    {
        get;
        set;
    }

    [DataField("MainId")]
    public int MainId
    {
        get;
        set;
    }
    
    [DataField("Data", IsNullable = true)]
    public string Data
    {
        get;
        set;
    }
}

public class TeUserAndExtend : TeUser
{
    [RelationField("Id", "MainId")]
    public TeUserExtend Extend
    {
        get;
        set;
    }
}
           

基本操作

  • 基本CURD
  • 批量CUD
  • 支援事務處理
  • 支援資料字段預設值和自動時間戳
  • 支援資料字段讀寫控制
  • 查詢結果指定類或匿名類輸出
  • 查詢結果直接插入資料表
var context = new DataContext();
// query single data
var item = context.Query<TeUser>().Where(x => x.Id == 10).First();
// query collection datas
var list = context.Query<TeUser>().Where(x => x.Id > 10).ToList();
// create date
var user = new TeUser() {
  Account = "foo",
  Password = "bar"
};
context.Insert(user);
// update data
user.Password = "bar1";
context.Update(user);
// delete data
context.Delete(user);
           

資料聚合

  • 單列資料直接聚合
  • 多列資料分組聚合
  • 格式化分組字段
  • 聚合資料直接插入資料表
// basic
var list = context.Query<TeUser> ()
         .Where (x => x.Id >= 5)
         .GroupBy (x => new LevelIdAgg () {
           LevelId = x.LevelId,
           Data = Function.Count ()
          })
         .ToList ();

// date format
var list = context.Query<TeUser> ()
         .GroupBy (x => new RegDateFormatAgg () {
           RegDateFormat = x.RegTime.ToString("yyyy-MM-dd"),
           Data = Function.Count ()
          })
         .ToList ();
           

Join表查詢

  • 多表連接配接,支援内連接配接,左連接配接和右連接配接
  • 支援查詢結果和聚合資料連接配接在一起
  • 連接配接查詢結果指定類或匿名類輸出
  • 連接配接查詢結果直接插入資料表
// inner join
var join = context.Query<TeUser> ()
                  .Join<TeUserExtend>((x,y) => x.Id == y.Id);

// aggregate data join entity table             
var join = context.Query<TeMainTable>()
                  .GroupBy(x => new {
                      MId = x.MId,
                      Count = Function.Count(),
                   })
                  .Join<TeSubTable>((x, y) => x.MId == y.Id);
           

執行SQL

  • 直接使用SQL和存儲過程
  • 支援對象參數
  • 查詢結果指定類或匿名類輸出
  • 存儲過程支援使用輸出參數
// basic parameter
var sql = "update Te_User set [email protected] where [email protected]";
var ps = new DataParameter[2];
ps[0] = new DataParameter("P1", 5);
ps[1] = new DataParameter("P2", "abc");
var executor = context.CreateSqlStringExecutor(sql, ps);
var ret = executor.ExecuteNonQuery();

// object parameter
var sql = "update Te_User set NickName={nickname} where Id={id}";
var executor = context.CreateSqlStringExecutor(sql, new { nickname = "abc", id = 5 });
var ret = executor.ExecuteNonQuery();
           

單元測試

該項目使用xUnit進行單元測試,測試代碼位址:https://github.com/aquilahkj/Light.Data2/tree/master/test

每個資料庫有超過300組測試,包含1,000個案例,涵蓋了大部分代碼。

性能測試

目前隻在同一台計算機上使用EF Core,為Linux做Docker Sql Server 2017做簡單的CURD性能測試代碼位址https://github.com/aquilahkj/OrmTest

1000次CUD和單個資料查詢

共有5輪,每輪1000次CUD和1000次資料查詢

EF測試結果

一個開源的ORM架構——Light.Data介紹如何使用

Light.Data測試結果

一個開源的ORM架構——Light.Data介紹如何使用

從比較來看,查詢性能幾乎相同,插入性能Light.Data略勝一籌,批量更新也略勝一籌。

本文僅作簡要介紹,您可以參考文檔和測試用例以了解具體的使用方法。

原文位址:https://www.codeproject.com/Articles/4649209/A-open-source-ORM-framework-Light-Data