Использование данных из бд в winforms

В приложении есть формы регистрации(подключил sql туда сохраняются данные), так же есть формы авторизации. Вопрос в том, как получить эти данные и проверить при попытке входа?


Ответы (1 шт):

Автор решения: Frehzy

Абстрактный репозиторий, на основе которого будем писать делать другие:

public abstract class GenericRepository<TDbContext, TEntity> : IRepository<TEntity>
                                                                where TDbContext : DbContext
                                                                where TEntity : class, IEntity
{
    protected readonly TDbContext _dbContext;

    protected abstract DbSet<TEntity> DbSet { get; }

    protected GenericRepository(TDbContext dbContext)
    {
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
    }

    public async Task<TEntity> Add(TEntity entity)
    {
        DbSet.Add(entity);

        await _dbContext.SaveChangesAsync();

        return entity;
    }

    public async Task<TEntity> Update(TEntity entity)
    {
        DbSet.Update(entity);

        await _dbContext.SaveChangesAsync();

        return entity;
    }

    public async Task Delete(TEntity entity)
    {
        DbSet.Remove(entity);

        await _dbContext.SaveChangesAsync();
    }

    public virtual async Task<TEntity?> GetById(Guid id)
    {
        var query = IncludeRelatedEntities(DbSet);
        return await query.FirstOrDefaultAsync(x => x.Id == id);
    }

    public virtual IQueryable<TEntity> GetAll() => IncludeRelatedEntities(DbSet);

    protected virtual IQueryable<TEntity> IncludeRelatedEntities(IQueryable<TEntity> query) => query;
}

Пример репозитория для сообщений в мессенджере:

public class MessageRepository : GenericRepository<ApplicationContext, MessageEntity>
{
    protected override DbSet<MessageEntity> DbSet => _dbContext.Messages;

    public MessageRepository(ApplicationContext dbContext)
        : base(dbContext)
    {
    }

    protected override IQueryable<MessageEntity> IncludeRelatedEntities(IQueryable<MessageEntity> query)
    {
        return query.Include(m => m.UserFrom)
                    .Include(m => m.UserTo);
    }
}

Пример сущности базы данных:

public class MessageEntity : Entity
{
    public MessageState State { get; set; }

    public string Message { get; set; } = null!;

    public Guid FromId { get; set; }

    [ForeignKey(nameof(FromId))]
    [InverseProperty(nameof(UserEntity.From))]
    public virtual UserEntity UserFrom { get; set; }

    public Guid ToId { get; set; }

    [ForeignKey(nameof(ToId))]
    [InverseProperty(nameof(UserEntity.To))]
    public virtual UserEntity UserTo { get; set; }
}

public abstract class Entity : IEntity
{
    public virtual Guid Id { get; set; } = Guid.NewGuid();

    public DateTime CreatedTime { get; set; } = DateTime.Now;
}

public class UserEntity : Entity
{
    public string Email { get; set; } = null!;

    public string Password { get; set; } = null!;

    [InverseProperty(nameof(MessageEntity.UserFrom))]
    public virtual ICollection<MessageEntity> From { get; set; } = new List<MessageEntity>();

    [InverseProperty(nameof(MessageEntity.UserTo))]
    public virtual ICollection<MessageEntity> To { get; set; } = new List<MessageEntity>();
}

Далее делаешь контроллер, который позволит взаимодействовать с твоим сервером посредством апи-запросов, внутри которого пишешь логику по взаимодействию с репозиторием. Пример получения клиентом сообщений от конкретного пользователя:

[ApiController]
[Route("/api/1.0/[controller]")]
public class MessageController : GenericController<MessageEntity>
{
    private const int MAX_MESSAGES = 100;

    private readonly IRepository<MessageEntity> _message;
    private readonly IRepository<UserEntity> _user;

    public MessageController(IRepository<MessageEntity> message,
                             IMapper mapper,
                             IRepository<UserEntity> user) : base(message, mapper)
    {
        _message = message;
        _user = user;
    }

    [HttpGet(nameof(GetMessage))]
    public async Task<ActionResult<List<MessageDto>>> GetMessage(Guid targetId, int offset, int count)
    {
        var to = await _user.GetById(targetId);
        if (to is null)
            return NotFound(targetId);
    
        if (offset < 0)
            offset = 0;
    
        if (count > MAX_MESSAGES || count <= 0)
            count = 100;
    
        return await _message.GetAll().Where(x => x.ToId.Equals(targetId))
                                      .OrderByDescending(x => x.CreatedTime)
                                      .Skip(offset)
                                      .Take(count)
                                      .Select(x => Mapper.Map<MessageDto>(x)).ToListAsync();
    }
}

Далее с клиента отправляешь запросы на сервер по нужному Url. Самый простой способ - использовать фреймворк Flurl. Достаточно простой в освоении. За минут 30 вполне можно разобраться в базовых вещах https://flurl.dev/

Если что-то будет не понятно, задавайте вопросы в комментариях

→ Ссылка