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.GetPaginatedListAsync(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)
{
services.AddGenericRepository<YourDbContext>();
}
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)
{
services.AddQueryRepository<YourDbContext>();
}
🛠️ Usage: Query
public class EmployeeService
{
// For query version, please use `IQueryRepository` instead of `IRepository`
private readonly IRepository _repository;
public EmployeeService(IRepository repository)
{
_repository = repository;
}
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;
public EmployeeService(IRepository repository)
{
_repository = repository;
}
// Single database operation.
public async Task<int> CreateAsync(Employee employee)
{
object[] primaryKeys = await _repository.InsertAsync(employee);
return (int)primaryKeys[0];
}
// Multiple database operations.
public async Task<int>> CreateAsync(Employee employee)
{
IDbContextTransaction transaction = await _repository.BeginTransactionAsync(IsolationLevel.ReadCommitted);
try
{
object[] primaryKeys = await _repository.InsertAsync(employee);
long employeeId = (long)primaryKeys[0];
EmployeeHistory employeeHistory = new EmployeeHistory()
{
EmployeeId = employeeId,
DepartmentId = employee.DepartmentId,
EmployeeName = employee.EmployeeName
};
await _repository.InsertAsync(employeeHistory);
await transaction.CommitAsync();
return employeeId;
}
catch (Exception)
{
await transaction.RollbackAsync();
throw;
}
}
}