Использование данных из бд в winforms
В приложении есть формы регистрации(подключил sql туда сохраняются данные), так же есть формы авторизации. Вопрос в том, как получить эти данные и проверить при попытке входа?
Ответы (1 шт):
Абстрактный репозиторий, на основе которого будем писать делать другие:
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/
Если что-то будет не понятно, задавайте вопросы в комментариях