快速示例
下面示例使用 SQLite 作为主线,但同样适用于 SQL Server、PostgreSQL、MySQL 和 DaMeng。Db 适合最小化样板代码;如果你已经在 ASP.NET Core 中使用依赖注入,可以直接跳到 依赖注入。
安装
下面示例展示如何安装 IceCoffee.Db4Net 包。若要安装其他包,请参阅 软件包 部分。
通过 NuGet 包管理控制台安装
powershell
Install-Package IceCoffee.Db4Net或者通过 .NET CLI
bash
dotnet add package IceCoffee.Db4Net安装数据库提供程序
- SQL Server
powershell
Install-Package Microsoft.Data.SqlClient- SQLite
powershell
Install-Package Microsoft.Data.Sqlite- PostgreSQL
powershell
Install-Package Npgsql- MySQL
powershell
Install-Package MySql.Data- DaMeng
powershell
Install-Package DM.DmProvider使用
1. 引入命名空间
csharp
using IceCoffee.Db4Net;
using IceCoffee.Db4Net.Core;
using IceCoffee.Db4Net.Extensions;
using IceCoffee.Db4Net.OptionalAttributes;2. 可选:先配置全局行为
csharp
Db.Configure(new Db4NetSettings
{
ParameterNamePrefix = "p",
ReuseParameters = true,
SqlCaptureMode = SqlCaptureMode.OnlyDebuggerAttached
});3. 注册数据库连接
最简单的是使用静态便捷 API:
csharp
string connectionString = "Data Source=InMemorySample;Mode=Memory;Cache=Shared";
Db.Register(DatabaseProvider.SQLite, connectionString);如果你更喜欢仓储实例,可以直接创建一个 Repository:
csharp
var repository = Db.CreateRepository();
var sameFoo = repository.Query<Foo>(1).GetSingleOrDefault();为了测试隔离或更细粒度的控制,也可以创建局部的 registry 实例:
csharp
var registry = Db.CreateDatabaseRegistry();
registry.Configure(Db.Registry.Settings);
registry.Register(DatabaseProvider.SQLite, connectionString);
var isolatedRepository = new Repository(registry, string.Empty);4. 定义实体
csharp
[Table("foo")]
public class Foo
{
[UniqueKey, DatabaseGenerated]
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public int Age { get; set; }
[Column("created_at")]
public DateTime CreatedAt { get; set; }
}5. 插入实体
csharp
var foo = new Foo
{
Name = "Tom",
Age = 18,
CreatedAt = DateTime.UtcNow
};
Db.Insert(foo).Execute();如果你需要数据库生成的 ID,可以直接用 InsertAndGetId:
csharp
int id = Db.InsertAndGetId(foo).Execute<int>();生成的 SQL 类似:
sql
INSERT INTO [foo] ([Name], [Age], [created_at]) VALUES (@Name, @Age, @CreatedAt)6. 根据 ID 查询实体
csharp
var foo = Db.Query<Foo>(1).GetSingleOrDefault();如果你更喜欢异步写法,方法名只需要在后面加上 Async:
csharp
var foo = await Db.Query<Foo>(1).GetSingleOrDefaultAsync();生成的 SQL 类似:
sql
SELECT [Id], [Name], [Age], [created_at] AS [CreatedAt] FROM [foo] WHERE [Id] = @p17. 更新实体
csharp
var foo = Db.Query<Foo>(1).GetSingleOrDefault();
if (foo != null)
{
foo.Name = "James";
Db.Update(foo).Execute();
}更新实体时会根据唯一键自动生成 WHERE,因此不会误写整张表。
8. 根据 ID 删除实体
csharp
Db.Delete<Foo>(1).Execute();也可以直接删除已加载的实体:
csharp
var foo = Db.Query<Foo>(1).GetSingleOrDefault();
if (foo != null)
{
Db.Delete(foo).Execute();
}生成的 SQL 类似:
sql
DELETE FROM [foo] WHERE [Id] = @p19. 事务入口
如果同一段业务需要多次写入共享一个事务,直接使用 UnitOfWork:
csharp
using var uow = Db.CreateUnitOfWork();
Db.Insert(foo).Execute(uow.DbTransaction);
Db.Update(foo).Execute(uow.DbTransaction);
uow.Commit();更多事务示例请看 事务。