在现代软件开发中,数据持久化是一个不可或缺的环节。ORM(对象关系映射)框架的出现使得开发者能够以面向对象的方式操作数据库,从而提高开发效率和代码的可维护性。Light.Data是一个轻量级的ORM框架,它支持多种数据库,提供了丰富的功能,包括CRUD操作、数据聚合、多表查询等。本文将详细介绍如何使用Light.Data进行数据库操作。
要使用Light.Data,首先需要通过NuGet安装相应的库。根据所使用的数据库类型,需要安装不同的包。以下是一些常见数据库的安装指令:
PM> Install-Package Light.Data
PM> Install-Package Light.Data.Mssql
PM> Install-Package Light.Data.Mysql
PM> Install-Package Light.Data.Postgre
安装完成后,可以通过访问官方文档和GitHub页面获取更多信息:
在开始使用Light.Data之前,需要配置数据库连接。以下是一个JavaScript格式的配置示例:
{
"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"
}
]
}
}
这个配置定义了两个数据库连接,分别用于连接SQL Server和MySQL数据库。
Light.Data提供了多种方式来使用。以下是一些常见的使用方式:
// 直接使用
DataContext context = new DataContext("mssql");
// 创建子类
public class MyDataContext : DataContext
{
public MyDataContext() : base("mssql") { }
}
// 创建子类并使用选项
public class MyDataContext : DataContext
{
public MyDataContext(DataContextOptions<MyDataContext> options) : base(options) { }
}
// 直接配置连接字符串和参数(IServiceCollection)
service.AddDataContext<MyDataContext>(builder => {
builder.UseMssql(connectionString);
builder.SetTimeout(2000);
builder.SetVersion("11.0");
}, ServiceLifetime.Transient);
// 使用默认配置文件配置(IServiceCollection)
service.AddDataContext<MyDataContext>(DataContextConfiguration.Global, config => {
config.ConfigName = "mssql";
}, ServiceLifetime.Transient);
这些代码展示了如何创建数据上下文、配置数据库连接以及使用依赖注入的方式集成到服务中。
对象映射是ORM框架的核心功能之一。Light.Data通过属性和配置文件将类映射到数据库表。以下是一个简单的对象映射示例:
[DataTable("Te_User", IsEntityTable = true)]
public class TeUser
{
[DataField("Id", IsIdentity = true, IsPrimaryKey = true)]
public int Id { get; set; }
[DataField("Account")]
public string Account { get; set; }
[DataField("Telephone", IsNullable = true)]
public string Telephone { get; set; }
}
这个类定义了一个用户表的映射,包括用户ID、账户和电话号码等字段。
在处理复杂的数据关系时,子表映射是一个常用的功能。以下是一个子表映射的示例:
[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; }
}
这个示例定义了一个用户扩展表,并将其与用户表关联起来。
Light.Data支持基本的CRUD操作,包括批量操作、事务处理、数据字段的默认值和自动时间戳等。以下是一个基本操作的示例:
var context = new DataContext();
// 查询单个数据
var item = context.Query<TeUser>().Where(x => x.Id == 10).First();
// 查询集合数据
var list = context.Query<TeUser>().Where(x => x.Id > 10).ToList();
// 创建数据
var user = new TeUser() {
Account = "foo",
Password = "bar"
};
context.Insert(user);
// 更新数据
user.Password = "bar1";
context.Update(user);
// 删除数据
context.Delete(user);
这些代码展示了如何使用Light.Data进行数据的查询、插入、更新和删除操作。
数据聚合是数据分析中的一个重要功能。Light.Data支持单列数据的直接聚合和多列数据的分组聚合。以下是一个数据聚合的示例:
var list = context.Query<TeUser>()
.Where(x => x.Id >= 5)
.GroupBy(x => new LevelIdAgg() {
LevelId = x.LevelId,
Data = Function.Count()
})
.ToList();
这个示例展示了如何对用户数据进行分组聚合操作。
在处理复杂的业务逻辑时,多表查询是一个常用的功能。Light.Data支持内连接、左连接和右连接等多表查询方式。以下是一个多表查询的示例:
var join = context.Query<TeUser>()
.Join<TeUserExtend>((x, y) => x.Id == y.Id);
这个示例展示了如何进行内连接查询。
在某些情况下,可能需要直接执行SQL语句或存储过程。Light.Data提供了直接执行SQL和存储过程的功能。以下是一个执行SQL的示例:
var sql = "update Te_User set NickName=@P2 where Id=@P1";
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();
这个示例展示了如何使用参数化查询执行更新操作。
为了确保代码的稳定性和可靠性,单元测试是必不可少的。Light.Data项目使用xUnit进行单元测试,测试代码地址为:。每个数据库都有超过300套测试,覆盖了大部分代码。