EF Core Generic Repository
This library is a Generic Repository implementation for EF Core ORM which will remove developers' pain to write repository layer for each .NET Core and .NET project.
โญ Giving a star
If you find this library useful, please don't forget to encouraging me to do such more stuffs by giving a star to this repository. Thank you.
๐ฅ What's new
Pagination Support:
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
});
Free raw SQL support:
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);
โ๏ธ This library includes following notable features:
-
This library can be run on any .NET Core or .NET application which has .NET Core 3.1, .NET Standard 2.1 and .NET 5.0+ support.
-
Itโs providing the Generic Repository with database transaction support.
-
It has all the required methods to query your data in whatever way you want without getting IQueryable from the repository.
-
It also has
Specification<T>
pattern support so that you can build your query dynamically i.e. differed query building. -
It also has database level projection support for your query.
-
It also has support to run raw SQL command against your relational database.
-
It also has support to choose whether you would like to track your query entity/entities or not.
-
It also has support to reset your EF Core DbContext state whenever you really needed.
-
Most importantly, it has full Unit Testing support.
-
Pagination support.
-
Free raw SQL query support both for complex type and primitive types.
โ๏ธ How do I get started?
For full version (both query and command support):
First install the latest version of TanvirArjel.EFCore.GenericRepository
nuget package into your project as follows:
Package Manager Console:
Install-Package TanvirArjel.EFCore.GenericRepository
.NET CLI:
dotnet add package TanvirArjel.EFCore.GenericRepository
Then in the ConfirugeServices
method of the Startup
class:
public void ConfigureServices(IServiceCollection services)
{
// For single DbContext
services.AddGenericRepository<YourDbContext>();
// If multiple DbContext
services.AddGenericRepository<YourDbContext1>();
services.AddGenericRepository<YourDbContext2>();
}
For query version only:
First install the latest version of TanvirArjel.EFCore.QueryRepository
nuget package into your project as follows:
Package Manager Console:
Install-Package TanvirArjel.EFCore.QueryRepository
.NET CLI:
dotnet add package TanvirArjel.EFCore.QueryRepository
Then in the ConfirugeServices
method of the Startup
class:
public void ConfigureServices(IServiceCollection services)
{
// For single DbContext
services.AddQueryRepository<YourDbContext>();
// For multiple DbContext
services.AddQueryRepository<YourDbContext1>();
services.AddQueryRepository<YourDbContext2>();
}
๐ ๏ธ Usage: Query
public class EmployeeService
{
// For query version, please use `IQueryRepository` instead of `IRepository`
private readonly IRepository _repository; // If single DbContext
private readonly IRepository<YourDbContext1> _dbConext1Repository; // If multiple DbContext
public EmployeeService(IRepository repository, IRepository<YourDbContext1> dbConext1Repository)
{
_repository = repository;
_dbConext1Repository = dbConext1Repository;
}
public async Task<Employee> GetEmployeeAsync(int employeeId)
{
Employee employee = await _repository.GetByIdAsync<Employee>(1);
return employee;
}
}
๐ ๏ธ Usage: Command
public class EmployeeService
{
private readonly IRepository _repository; // If single DbContext
private readonly IRepository<YourDbContext1> _dbConext1Repository; // If multiple DbContext
public EmployeeService(IRepository repository, IRepository<YourDbContext1> dbConext1Repository)
{
_repository = repository;
_dbConext1Repository = dbConext1Repository;
}
public async Task<int> CreateAsync(Employee employee)
{
await _repository.AddAsync(employee);
await _repository.SaveChangesAsync();
return employee.Id;
}
}