AspNetCoreMicroserviceInitializer.Database
1.1.0
See the version list below for details.
dotnet add package AspNetCoreMicroserviceInitializer.Database --version 1.1.0
NuGet\Install-Package AspNetCoreMicroserviceInitializer.Database -Version 1.1.0
<PackageReference Include="AspNetCoreMicroserviceInitializer.Database" Version="1.1.0" />
paket add AspNetCoreMicroserviceInitializer.Database --version 1.1.0
#r "nuget: AspNetCoreMicroserviceInitializer.Database, 1.1.0"
// Install AspNetCoreMicroserviceInitializer.Database as a Cake Addin #addin nuget:?package=AspNetCoreMicroserviceInitializer.Database&version=1.1.0 // Install AspNetCoreMicroserviceInitializer.Database as a Cake Tool #tool nuget:?package=AspNetCoreMicroserviceInitializer.Database&version=1.1.0
All NuGet packages
- AspNetCoreMicroserviceInitializer.Registrations
- AspNetCoreMicroserviceInitializer.TradingDesk
- AspNetCoreMicroserviceInitializer.Database
What It This?
A library with basic repository models, interfaces and the IEntity database entity.
This library contains the basic interfaces for working with databases.
It is assumed that the library will be used in conjunction with other libraries to quickly deploy microservices: "AspNetCoreMicroserviceInitializer.TradingDesk" and "AspNetCoreMicroserviceInitializer.Registrations".
The most up-to-date documentation on GitHub: https://github.com/qpashkaaa/Asp-Net-Core-Microservice-Initializer
Functional features
- Various interfaces for working with the database.
/// <summary>
/// Интерфейс базовой сущности.
/// </summary>
/// <typeparam name="TId">Тип Id.</typeparam>
public interface IEntity<TId> where TId : struct
{
/// <summary>
/// Идентификатор.
/// </summary>
TId Id { get; set; }
/// <summary>
/// Дата создания сущности.
/// </summary>
DateTime CreationDate { get; set; }
}
/// <summary>
/// Интерфейс репозитория чтения.
/// </summary>
/// <typeparam name="TEntity">Тип сущности.</typeparam>
public interface IReadRepository<TEntity>
where TEntity : IEntity<long>
{
/// <summary>
/// Метод получения всех записей из таблицы.
/// </summary>
/// <returns>Коллекцию типа <see cref="IEnumerable{TEntity}"/>.</returns>
Task<IEnumerable<TEntity>> GetAllAsync();
/// <summary>
/// Получить записи по идентификаторам.
/// </summary>
/// <param name="ids">Массив идентификаторов типа <see cref="IEnumerable{long}"/>.</param>
/// <returns>Коллекцию типа <see cref="IEnumerable{TEntity}"/>.</returns>
Task<IEnumerable<TEntity>> GetByIdsAsync(IEnumerable<long> ids);
/// <summary>
/// Получить запись по идентификатору.
/// </summary>
/// <param name="id">Идентификатор.</param>
/// <returns>Модель типа <see cref="TEntity"/>, <see langword="null"/> если не найдена.</returns>
Task<TEntity?> GetByIdAsync(long id);
/// <summary>
/// Получить записи с помощью пагинации.
/// </summary>
/// <param name="pageNumber">Номер строки.</param>
/// <param name="pageSize">Количество записей.</param>
/// <returns>Коллекцию типа <see cref="IEnumerable{TEntity}"/>.</returns>
Task<IEnumerable<TEntity>> GetPageAsync(int pageNumber, int pageSize);
/// <summary>
/// Проверить существование элемента.
/// </summary>
/// <param name="id">Идентификатор.</param>
/// <returns><see langword="true"/> если элемент существует, <see langword="false"/> если элемент не существует.</returns>
Task<bool> IsExistsAsync(long id);
}
/// <summary>
/// Интерфейс репозитория записи.
/// </summary>
/// <typeparam name="TEntity">Тип сущности.</typeparam>
public interface IWriteRepository<TEntity>
where TEntity : IEntity<long>
{
/// <summary>
/// Метод вставки записи в таблицу.
/// </summary>
/// <param name="entity">Сущность типа <see cref="TEntity"/>.</param>
Task InsertAsync(TEntity entity);
/// <summary>
/// Метод вставки нескольких записей в таблицу.
/// </summary>
/// <param name="entities">Массив сущностей типа <see cref="IEnumerable{TEntity}"/>.</param>
Task InsertBatchAsync(IEnumerable<TEntity> entities);
/// <summary>
/// Обновить запись в таблице.
/// </summary>
/// <param name="entity">Сущность типа <see cref="TEntity"/>.</param>
Task UpdateAsync(TEntity entity);
/// <summary>
/// Метод обновления несколких записей в таблице.
/// </summary>
/// <param name="entities">Массив значений типа <see cref="IEnumerable{TEntity}"/>.</param>
Task UpdateBatchAsync(IEnumerable<TEntity> entities);
/// <summary>
/// Метод удаления записи по идентификатору.
/// </summary>
/// <param name="id">Идентификатор.</param>
Task DeleteByIdAsync(long id);
/// <summary>
/// Метод удаления записей по их идентификаторам.
/// </summary>
/// <param name="ids">Массив идентификаторов типа <see cref="IEnumerable{long}"/>.</param>
/// <returns>Количество успешно удаленных записей.</returns>
Task<int> DeleteByIdsAsync(IEnumerable<long> ids);
}
/// <summary>
/// Интерфейс базового репозитория.
/// </summary>
/// <typeparam name="TEntity">Тип сущности.</typeparam>
public interface IRepository<TEntity> :
IReadRepository<TEntity>,
IWriteRepository<TEntity>
where TEntity : IEntity<long>
{
}
- The base class of an abstract relational database repository.
/// <summary>
/// Абстрактный класс базового репозитория.
/// </summary>
public abstract class RepositoryBase<TEntity> : IRepository<TEntity>
where TEntity : class, IEntity<long>
{
/// <summary>
/// Контекст БД.
/// </summary>
private readonly DbContext _dbContext;
/// <summary>
/// Конструктор <see cref="RepositoryBase{TEntity}"/>.
/// </summary>
/// <param name="dbContext">Контекст БД.</param>
protected RepositoryBase(DbContext dbContext)
{
_dbContext = dbContext;
}
/// <summary>
/// Метод получения всех записей из таблицы.
/// </summary>
/// <returns>Коллекцию типа <see cref="IEnumerable{TEntity}"/>.</returns>
public virtual async Task<IEnumerable<TEntity>> GetAllAsync()
{
return await _dbContext.Set<TEntity>().ToListAsync();
}
/// <summary>
/// Получить запись по идентификатору.
/// </summary>
/// <param name="id">Идентификатор.</param>
/// <returns>Модель типа <see cref="TEntity"/>, <see langword="null"/> если не найдена.</returns>
public virtual async Task<TEntity?> GetByIdAsync(long id)
{
return await _dbContext.Set<TEntity>().FindAsync(id);
}
/// <summary>
/// Получить записи по идентификаторам.
/// </summary>
/// <param name="ids">Массив идентификаторов типа <see cref="IEnumerable{long}"/>.</param>
/// <returns>Коллекцию типа <see cref="IEnumerable{TEntity}"/>.</returns>
public virtual async Task<IEnumerable<TEntity>> GetByIdsAsync(IEnumerable<long> ids)
{
return await _dbContext.Set<TEntity>()
.Where(e => ids.Contains(e.Id))
.ToListAsync();
}
/// <summary>
/// Получить записи с помощью пагинации.
/// </summary>
/// <param name="pageNumber">Номер строки.</param>
/// <param name="pageSize">Количество записей.</param>
/// <returns>Коллекцию типа <see cref="IEnumerable{TEntity}"/>.</returns>
public virtual async Task<IEnumerable<TEntity>> GetPageAsync(int pageNumber, int pageSize)
{
return await _dbContext.Set<TEntity>()
.OrderBy(entity => entity.Id)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
}
/// <summary>
/// Проверить существование элемента.
/// </summary>
/// <param name="id">Идентификатор.</param>
/// <returns><see langword="true"/> если элемент существует, <see langword="false"/> если элемент не существует.</returns>
public virtual async Task<bool> IsExistsAsync(long id)
{
return await _dbContext.Set<TEntity>()
.AnyAsync(e => e.Id == id);
}
/// <summary>
/// Метод удаления записи по идентификатору.
/// </summary>
/// <param name="id">Идентификатор.</param>
public virtual async Task DeleteByIdAsync(long id)
{
var entity = await GetByIdAsync(id);
if (entity == null)
{
throw new ArgumentNullException(nameof(entity));
}
_dbContext.Entry(entity).State = EntityState.Deleted;
await _dbContext.SaveChangesAsync();
}
/// <summary>
/// Метод удаления записей по их идентификаторам.
/// </summary>
/// <param name="ids">Массив идентификаторов типа <see cref="IEnumerable{long}"/>.</param>
/// <returns>Количество успешно удаленных записей.</returns>
public virtual async Task<int> DeleteByIdsAsync(IEnumerable<long> ids)
{
return await _dbContext.Set<TEntity>()
.Where(entity => ids.Contains(entity.Id))
.ExecuteDeleteAsync();
}
/// <summary>
/// Метод вставки записи в таблицу.
/// </summary>
/// <param name="entity">Сущность типа <see cref="TEntity"/>.</param>
public virtual async Task InsertAsync(TEntity entity)
{
entity.CreationDate = DateTime.UtcNow;
await _dbContext.Set<TEntity>().AddAsync(entity);
await _dbContext.SaveChangesAsync();
}
/// <summary>
/// Метод вставки нескольких записей в таблицу.
/// </summary>
/// <param name="entities">Массив сущностей типа <see cref="IEnumerable{TEntity}"/>.</param>
public virtual async Task InsertBatchAsync(IEnumerable<TEntity> entities)
{
foreach (var entity in entities)
{
entity.CreationDate = DateTime.UtcNow;
}
await _dbContext.Set<TEntity>().AddRangeAsync(entities);
await _dbContext.SaveChangesAsync();
}
/// <summary>
/// Обновить запись в таблице.
/// </summary>
/// <param name="entity">Сущность типа <see cref="TEntity"/>.</param>
public virtual async Task UpdateAsync(TEntity entity)
{
await SetImmutableFields(entity);
_dbContext.Set<TEntity>().Update(entity);
await _dbContext.SaveChangesAsync();
}
/// <summary>
/// Метод обновления несколких записей в таблице.
/// </summary>
/// <param name="entities">Массив значений типа <see cref="IEnumerable{TEntity}"/>.</param>
public virtual async Task UpdateBatchAsync(IEnumerable<TEntity> entities)
{
foreach (var entity in entities)
{
await SetImmutableFields(entity);
}
_dbContext.Set<TEntity>().UpdateRange(entities);
await _dbContext.SaveChangesAsync();
}
/// <summary>
/// Метод сохранения неизменяемых полей сущности.
/// </summary>
/// <param name="entity">Сущность типа <see cref="TEntity"/>.</param>
private async Task SetImmutableFields(TEntity entity)
{
var existEntity = await _dbContext.Set<TEntity>().AsNoTracking().FirstOrDefaultAsync(e => e.Id == entity.Id);
entity.CreationDate = existEntity?.CreationDate ?? throw new ArgumentNullException(nameof(existEntity));
}
}
Tech Stack
- .NET 8
NuGet Packages
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Relational
Microsoft.EntityFrameworkCore.Tools
Authors
Contacts
Year of Development
2024
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net8.0
- Microsoft.EntityFrameworkCore (>= 9.0.0)
- Microsoft.EntityFrameworkCore.Relational (>= 9.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on AspNetCoreMicroserviceInitializer.Database:
Package | Downloads |
---|---|
AspNetCoreMicroserviceInitializer.Registrations
This library adds a new class `WebApplicationFacade`, which helps you quickly deploy the `.NET 8` microservice and add the desired modules to the application. The most up-to-date documentation on GitHub Wiki: https://github.com/qpashkaaa/Asp-Net-Core-Microservice-Initializer/wiki. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Big changes to the library group:
AspNetCoreMicroserviceInitializer.Database
- RepositoryBase's DbContext has been changed to protected.
AspNetCoreMicroserviceInitializer.Registrations
- added the ability to configure automatic shutdown of the application after performing actions when using the migrator (new configuration of the config).
AspNetCoreMicroserviceInitializer.TradingDesk
- added the ability to configure automatic shutdown of the application after performing actions when using the migrator (new configuration of the config).
- the creation of docker-compose files has been redesigned. Now they are made from base64, which is stored in the code.