EF Core 通用仓储
这个库是 EF Core ORM 的通用仓储实现,可以减轻开发人员为每个 .NET Core 和 .NET 项目编写仓储层的痛苦。
⭐ 给个星星
如果你觉得这个库有用,请别忘了给这个仓库点个星以鼓励我做更多类似的工作。谢谢。
🔥 最新特性
分页支持:
PaginationSpecification<Employee> specification = new PaginationSpecification<Employee>();
specification.Conditions.Add(e => e.Name.Contains("Ta"));
specification.PageIndex = 1;
specification.PageSize = 10;
PaginatedList<EmployeeDto> paginatedList = await _repository.GetListAsync(specification, e => new EmployeeDto
{
Id = e.Id
Name = e.Name,
DepartmentName = e.DepartmentName
});
自由原生 SQL 支持:
List<string> search = new List<string>() { "Tanvir", "Software" };
string sqlQuery = "Select EmployeeName, DepartmentName from Employee Where EmployeeName LIKE @p0 + '%' and DepartmentName LIKE @p1 + '%'";
List<EmployeeDto> items = await _repository.GetFromRawSqlAsync<EmployeeDto>(sqlQuery, search);
⚙️ 这个库包含以下显著特性:
-
这个库可以在任何支持 .NET Core 3.1、.NET Standard 2.1 和 .NET 5.0+ 的 .NET Core 或 .NET 应用程序中运行。
-
它提供了带有数据库事务支持的通用仓储。
-
它拥有所有必要的方法,可以让你以任何想要的方式查询数据,而无需从仓储获取 IQueryable
。 -
它还支持
Specification<T>
模式,因此你可以动态构建查询,即延迟查询构建。 -
它还支持数据库级别的查询投影。
-
它还支持对关系数据库运行原生 SQL 命令。
-
它还支持选择是否要跟踪查询的实体。
-
它还支持在你真正需要时重置 EF Core DbContext 状态。
-
最重要的是,它完全支持单元测试。
-
分页支持。
-
对复杂类型和基本类型都支持自由原生 SQL 查询。
✈️ 如何开始使用?
完整版本 (同时支持查询和命令):
首先通过以下方式将最新版本的 TanvirArjel.EFCore.GenericRepository
nuget 包安装到你的项目中:
包管理器控制台:
Install-Package TanvirArjel.EFCore.GenericRepository
.NET CLI:
dotnet add package TanvirArjel.EFCore.GenericRepository
然后在 Startup
类的 ConfigureServices
方法中:
public void ConfigureServices(IServiceCollection services)
{
// 单个 DbContext
services.AddGenericRepository<YourDbContext>();
// 多个 DbContext
services.AddGenericRepository<YourDbContext1>();
services.AddGenericRepository<YourDbContext2>();
}
仅查询版本:
首先通过以下方式将最新版本的 TanvirArjel.EFCore.QueryRepository
nuget 包安装到你的项目中:
包管理器控制台:
Install-Package TanvirArjel.EFCore.QueryRepository
.NET CLI:
dotnet add package TanvirArjel.EFCore.QueryRepository
然后在 Startup
类的 ConfigureServices
方法中:
public void ConfigureServices(IServiceCollection services)
{
// 单个 DbContext
services.AddQueryRepository<YourDbContext>();
// 多个 DbContext
services.AddQueryRepository<YourDbContext1>();
services.AddQueryRepository<YourDbContext2>();
}
🛠️ 使用: 查询
public class EmployeeService
{
// 对于查询版本,请使用 `IQueryRepository` 代替 `IRepository`
private readonly IRepository _repository; // 单个 DbContext
private readonly IRepository<YourDbContext1> _dbContext1Repository; // 多个 DbContext
public EmployeeService(IRepository repository, IRepository<YourDbContext1> dbContext1Repository)
{
_repository = repository;
_dbContext1Repository = dbContext1Repository;
}
public async Task<Employee> GetEmployeeAsync(int employeeId)
{
Employee employee = await _repository.GetByIdAsync<Employee>(employeeId);
return employee;
}
}
🛠️ 使用: 命令
public class EmployeeService
{
private readonly IRepository _repository; // 单个 DbContext
private readonly IRepository<YourDbContext1> _dbContext1Repository; // 多个 DbContext
public EmployeeService(IRepository repository, IRepository<YourDbContext1> dbContext1Repository)
{
_repository = repository;
_dbContext1Repository = dbContext1Repository;
}
public async Task<int> CreateAsync(Employee employee)
{
await _repository.AddAsync(employee);
await _repository.SaveChangesAsync();
return employee.Id;
}
}