关于 entity-framework
面向使用 EF Core 的开发者,提供 Sorcha 的 EF Core 9+ 与 PostgreSQL 数据访问模式指南,涵盖仓储、软删除和迁移。
主要功能
- 01PostgreSQL DbContext 配置
- 02通用及专用仓储模式
- 03软删除查询过滤器
- 04迁移创建与启动时应用
- 05JSONB 与批量更新
适用场景
- 01为 Sorcha 服务配置数据库
- 02实现带可选关联加载的仓储
- 03管理软删除数据
- 04创建并应用数据库迁移
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ stuartf303/ sorcha --skill entity-framework安装后在 Claude Code 中输入/entity-framework确认已加载。
附带文件references/patterns.mdreferences/workflows.md
详细介绍
Entity Framework Core 技能
Sorcha 使用 EF Core 9+ 和 PostgreSQL(Npgsql)作为主要关系型数据存储。代码库采用分层仓储模式,包含通用和专用仓储,通过查询筛选器实现软删除,并在启动时自动执行迁移。
快速开始
使用 PostgreSQL 注册 DbContext
// src/Common/Sorcha.Storage.EFCore/Extensions/EFCoreServiceExtensions.cs
services.AddDbContext<WalletDbContext>((sp, options) =>
{
var dataSource = sp.GetRequiredService<NpgsqlDataSource>();
options.UseNpgsql(dataSource, npgsql =>
{
npgsql.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorCodesToAdd: null);
npgsql.MigrationsHistoryTable("__EFMigrationsHistory", "wallet");
});
});
创建迁移
# From project directory containing DbContext
dotnet ef migrations add InitialSchema --project src/Common/Sorcha.Wallet.Core --startup-project src/Services/Sorcha.Wallet.Service
以编程方式应用迁移
// Startup pattern used in Sorcha services
var pending = await dbContext.Database.GetPendingMigrationsAsync();
if (pending.Any())
await dbContext.Database.MigrateAsync();
核心概念
| 概念 | 用途 | 示例 |
|---|---|---|
| DbContext | 架构定义 + 更改跟踪 | WalletDbContext、TenantDbContext |
| Repository | 数据访问抽象 | EFCoreRepository<T, TId, TContext> |
| 软删除 | 对 DeletedAt 使用查询筛选器 | .HasQueryFilter(e => e.DeletedAt == null) |
| JSONB | PostgreSQL JSON 列 | .HasColumnType("jsonb") |
| ExecuteUpdate | 无需加载数据即可批量更新 | ExecuteUpdateAsync(s => s.SetProperty(...)) |
常见模式
使用可选预先加载的仓储
// src/Common/Sorcha.Wallet.Core/Repositories/EfCoreWalletRepository.cs
public async Task<WalletEntity?> GetByAddressAsync(string address, bool includeAddresses = false)
{
IQueryable<WalletEntity> query = _context.Wallets;
if (includeAddresses)
query = query.Include(w => w.Addresses);
return await query.AsNoTracking().FirstOrDefaultAsync(w => w.Address == address);
}
使用筛选器绕过软删除
// Bypass query filter for admin operations
var deleted = await _context.Wallets
.IgnoreQueryFilters()
.FirstOrDefaultAsync(w => w.Address == address);
另请参阅
相关技能
- 有关连接配置和 PostgreSQL 特定功能,请参阅 postgresql 技能
- 有关服务注册和运行状况检查,请参阅 aspire 技能
- 有关使用 InMemory 提供程序测试 DbContext,请参阅 xunit 技能
文档资源
使用 Context7 获取最新的 EF Core 文档。
库 ID: /dotnet/entityframework.docs
推荐查询:
- "DbContext pooling configuration dependency injection"
- "migrations code-first apply production deployment"
- "query filters soft delete global filters"
- "bulk operations ExecuteUpdate ExecuteDelete"
评论
支持 Markdown