Acme.EFCore.Small 实战:告别繁琐 CRUD,让 .NET 数据库操作更优雅|.NET 8 效率神器

作为 .NET 开发者,我们每天都在与数据库打交道。Entity Framework Core 虽然强大,但每次搭建项目时都要重复配置仓储、处理工作单元、编写基础增删改查代码,实在令人心累。

今天给大家推荐一款轻量级的 EFCore 通用库——Acme.EFCore.Small。它封装了 EF Core 的繁琐细节,提供开箱即用的仓储模式和事务管理,让你专注于业务逻辑的实现。

📦 最新版本:v1.3.6.4 📅 更新亮点:支持 .NET 10,修复了已知的并发问题。

NuGet Acme.EFCore.Small

🚀 功能亮点

  • 即插即用:通过 NuGet 一键安装,快速集成到现有项目

  • 多数据库支持:兼容 SQL Server、MySQL、PostgreSQL、Oracle 等主流数据库

  • 仓储模式封装:内置单库/多库两种仓储模式,告别重复的 DbContext 操作

  • 事务自动管理:简单易懂的事务控制 API,避免数据不一致

  • 高性能扩展:支持无跟踪查询、动态排序、分页等高级特性

  • 跨版本兼容:从 .NET Core 3.1 到 .NET 10,全版本覆盖

🛠️ 快速上手(5分钟搞定)

第一步:安装核心包

在 NuGet 包管理器中搜索 Acme.EFCore.Small 并安装。

NuGet 包管理器界面

NuGet 包管理器界面

第二步:安装数据库驱动

根据你的数据库类型,选择对应的驱动包:

数据库NuGet 包
SQL ServerMicrosoft.EntityFrameworkCore.SqlServer
MySQLPomelo.EntityFrameworkCore.MySql
PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
SQLiteMicrosoft.EntityFrameworkCore.Sqlite

SQL Server安装包示意图

SQL Server安装包示意图

第三步:创建上下文与实体

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
    
    public DbSet<User> Users { get; set; }
    public DbSet<Product> Products { get; set; }
}

// 继承 BaseEntity,自动获得 Id、CreateTime 等通用属性
public class User : BaseEntity
{
    public string Name { get; set; }
    public string Email { get; set; }
}

第四步:配置连接字符串

appsettings.json 中添加数据库连接信息:

{
    "ConnectionStrings": {
        "DefaultConnection": "Server=.;Database=MyDb;User Id=sa;Password=xxx;"
    }
}

第五步:依赖注入

Program.csStartup.cs 中一行代码注册服务:

// 配置 DbContext
services.AddDbContext<AppDbContext>(options => 
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

// 注入单库仓储(一个数据库)
services.AddRepositorys<AppDbContext>();

至此,你的项目已经具备完整的数据库操作能力,接下来就可以愉快地使用仓储进行数据操作了。

📦 核心功能演示

1. 基础增删改查

在业务层注入 IRepository<User>,无需编写任何仓储实现代码:

public class UserService
{
    private readonly IRepository<User> _userRepo;
    
    public UserService(IRepository<User> userRepo)
    {
        _userRepo = userRepo;
    }
    
    // 添加并立即保存
    public User AddUser(string name, string email)
    {
        var user = new User { Name = name, Email = email };
        return _userRepo.AddNowSave(user);
    }
    
    // 条件查询
    public User GetUserById(int id)
    {
        return _userRepo.GetInfo(u => u.Id == id);
    }
    
    // 异步操作
    public async Task<List<User>> GetAllUsersAsync()
    {
        return await _userRepo.GetListAsync();
    }
}

2. 多库场景支持

如果你的项目需要连接多个数据库,只需指定上下文即可:

// 注入多个仓储
private readonly IRepository<AppDbContext, User> _userRepo;
private readonly IRepository<LogDbContext, Log> _logRepo;

3. 事务管理

内置事务封装,让你轻松保证数据一致性:

public void CreateOrder(Order order)
{
    try
    {
        _orderRepo.BeginTransaction();
        
        _orderRepo.Add(order);
        foreach (var item in order.Items)
        {
            _itemRepo.Add(item);
        }
        
        _orderRepo.CommitTransaction();
    }
    catch
    {
        _orderRepo.RollbackTransaction();
        throw;
    }
    finally
    {
        _orderRepo.DisposeTransaction();
    }
}

4. 分页与排序

使用 ToPageList 扩展方法,分页代码简洁明了:

public PageList<User> GetUsers(int pageIndex, int pageSize, string keyword)
{
    var query = _userRepo.Queryable(u => u.Name.Contains(keyword));
    return query.ToPageList(pageIndex, pageSize);
}

// 动态排序
query = query.OrderBy("CreateTime", isAscending: false);

5. 性能优化:无跟踪查询

对于只读报表类场景,使用 GetListNoTracking 可以有效提升性能:

var list = _userRepo.GetListNoTracking(u => u.IsActive == true);

🧩 高级玩法

值对象与聚合根

库中内置了领域驱动设计(DDD)的基础抽象类:

  • BaseAggregateRoot:适合 Order、Customer 等聚合根实体

  • BaseValueObject:适合 Address、Money 等值对象

自定义扩展

你可以基于 IRepository 接口进行扩展,增加自定义的查询方法,仓储层依然保持整洁。

📌 支持的 .NET 版本

版本支持情况
.NET Core 3.1
.NET 5 / 6 / 7 / 8 / 9 / 10

各 .NET 版本兼容性展示图

项目地址:https://www.nuget.org/packages/Acme.EFCore.Small/

🎯 结语

Acme.EFCore.Small 不追求大而全,而是专注于解决 80% 的日常数据库操作痛点。如果你正在搭建一个新的 .NET 项目,或者想重构现有项目中的数据库访问层,不妨试试这款轻量级利器。

欢迎在评论区分享你的使用体验。

公众号:【.NET修仙日记】

posted @ 2026-03-21 17:14  云中小生  阅读(21)  评论(0)    收藏  举报  来源