using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query; using Ombi.Helpers; using Ombi.Store.Context; using Ombi.Store.Entities; namespace Ombi.Store.Repository { public class BaseRepository : IRepository where T : Entity where U : IDbContext { public BaseRepository(U ctx) { _ctx = ctx; _db = _ctx.Set(); } public DbSet _db { get; } private readonly U _ctx; public async Task Find(object key) { return await _db.FindAsync(key); } public IQueryable GetAll() { return _db.AsQueryable(); } public async Task FirstOrDefaultAsync(Expression> predicate) { return await _db.FirstOrDefaultAsync(predicate); } public async Task AddRange(IEnumerable content, bool save = true) { _db.AddRange(content); if (save) { await InternalSaveChanges(); } } public async Task Add(T content) { await _db.AddAsync(content); await InternalSaveChanges(); return content; } public async Task Delete(T request) { _db.Remove(request); await InternalSaveChanges(); } public async Task DeleteRange(IEnumerable req) { _db.RemoveRange(req); await InternalSaveChanges(); } public async Task SaveChangesAsync() { return await InternalSaveChanges(); } public IIncludableQueryable Include( IQueryable source, Expression> navigationPropertyPath) where TEntity : class { return source.Include(navigationPropertyPath); } public async Task ExecuteSql(string sql) { await _ctx.Database.ExecuteSqlCommandAsync(sql); } protected async Task InternalSaveChanges() { return await _ctx.SaveChangesAsync(); } private bool _disposed; // Protected implementation of Dispose pattern. protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { _ctx?.Dispose(); } _disposed = true; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } }