Api/Berizco.Repository/Repositories/Base/BaseRepository.cs

90 lines
2.5 KiB
C#

using Brizco.Common.Extensions;
namespace Brizco.Repository.Repositories.Base
{
public class BaseRepository<T> : Repository<T>, IBaseRepository<T> where T : class, IApiEntity
{
public BaseRepository(ApplicationContext dbContext) : base(dbContext)
{
}
public virtual async ValueTask<T> GetByIdAsync(CancellationToken cancellationToken, params object[] ids)
{
return await Entities.FindAsync(ids, cancellationToken);
}
#region Sync Methods
public virtual T GetById(params object[] ids)
{
var ent = Entities.Find(ids);
Detach(ent);
return ent;
}
public virtual void Add(T entity)
{
AssertExtensions.NotNull(entity, nameof(entity));
Entities.Add(entity);
}
public virtual void AddRange(IEnumerable<T> entities)
{
AssertExtensions.NotNull(entities, nameof(entities));
Entities.AddRange(entities);
}
public virtual void Update(T entity)
{
AssertExtensions.NotNull(entity, nameof(entity));
Detach(entity);
Entities.Update(entity);
}
public virtual void UpdateRange(IEnumerable<T> entities)
{
AssertExtensions.NotNull(entities, nameof(entities));
Entities.UpdateRange(entities);
}
public void HardDelete(T entity)
{
AssertExtensions.NotNull(entity, nameof(entity));
Entities.Remove(entity);
}
public virtual void Delete(T entity)
{
AssertExtensions.NotNull(entity, nameof(entity));
Entities.Remove(entity);
}
public virtual void DeleteRange(IEnumerable<T> entities)
{
AssertExtensions.NotNull(entities, nameof(entities));
Entities.RemoveRange(entities);
}
#endregion
#region Attach & Detach
public virtual void Detach(T entity)
{
AssertExtensions.NotNull(entity, nameof(entity));
var entry = DbContext.Entry(entity);
if (entry != null)
entry.State = EntityState.Detached;
}
public virtual void Attach(T entity)
{
AssertExtensions.NotNull(entity, nameof(entity));
if (DbContext.Entry(entity).State == EntityState.Detached)
Entities.Attach(entity);
}
#endregion
}
}