Skip to content

快速示例

下面示例使用 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] = @p1

7. 更新实体

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] = @p1

9. 事务入口

如果同一段业务需要多次写入共享一个事务,直接使用 UnitOfWork

csharp
using var uow = Db.CreateUnitOfWork();
Db.Insert(foo).Execute(uow.DbTransaction);
Db.Update(foo).Execute(uow.DbTransaction);
uow.Commit();

更多事务示例请看 事务