using Backend.ApplicationCore.Interfaces.IRepositories; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Backend.Infrastructure.Repositories { public class GenericRepository : IDisposable, IGenericRepository where TEntity : class { protected readonly IApplicationDatabaseContext _context; protected readonly DbSet _dbSet; public GenericRepository(IApplicationDatabaseContext context) { _context = context; _dbSet = context.Set(); } /// /// FindAsync find entity by Id /// /// /// public virtual async Task FindAsync(object id) { _dbSet.AsNoTracking(); return await _dbSet.FindAsync(id); } /// /// FindAllAsync find all entries Without pagination /// /// public virtual async Task> FindAllAsync() { using var findTask = Task.FromResult(_dbSet.AsEnumerable()); return await findTask; } /// /// CountAsync - Count entries /// /// public virtual async Task CountAsync() { using var countTask = _dbSet.CountAsync(); return await countTask; } /// /// AddAsync - use to add an Entity without relationship /// /// /// public virtual async Task AddAsync(TEntity entity) { await _dbSet.AddAsync(entity); return entity; } /// /// UpdateAsync update an Entity /// /// /// public virtual async Task UpdateAsync(TEntity entity) { using var updateTask = Task.FromResult(_dbSet.Update(entity)); await updateTask; return entity; } public virtual EntityEntry Entry(TEntity entity, TEntity ExistEntity) { _context.Entry(ExistEntity).State = EntityState.Detached; _context.Entry(ExistEntity).CurrentValues.SetValues(entity); return _context.Entry(entity); } /// /// DeleteAsync delete en antity by Id /// /// /// public virtual async Task DeleteAsync(Guid id) { var entity = await FindAsync(id); await DeleteAsync(entity); } public virtual async Task DeleteAsync(int id) { var entity = await FindAsync(id); await DeleteAsync(entity); } /// /// DeleteAsync delete entity /// /// /// public virtual async Task DeleteAsync(TEntity entity) { using var removeTask = Task.FromResult(_dbSet.Remove(entity)); await removeTask; } /// /// SaveChangesAsync save dbContext changes /// /// /// public virtual async Task SaveChangesAsync(CancellationToken cancellationToken = default) { using var saveChangeTask = _context.SaveChangesAsync(cancellationToken); return await saveChangeTask; } /// /// Dispose /// public void Dispose() { _context?.Dispose(); } } }