type 'Commands.UpdateFirmDateCommand' cannot be used as type parameter 'TRequest' in the generic type or method 'IRequestHandler<TRequest, TResponse>'

I am using asp.net core 6 web api ,entity framework code first and CQRS – Mediatr for a project which has functinalities to update database and get data from database and show it in the swaggerui but I came across with a problem when I try to create a handler for the update data by its ID in the database I get this error :
Error CS0311 The type 'EnocaChallengeV2.Commands.UpdateFirmDateCommand' cannot be used as type parameter 'TRequest' in the generic type or method 'IRequestHandler<TRequest, TResponse>'. There is no implicit reference conversion from 'EnocaChallengeV2.Commands.UpdateFirmDateCommand' to 'MediatR.IRequest<int>'.

This is my Command:

using EnocaChallengeV2.Models;
using MediatR;

namespace EnocaChallengeV2.Commands
{
    public class UpdateFirmDateCommand : IRequest<Firm> {
        public int Id { get; set; }
        public DateTime startTime { get; set; }
        public DateTime endTime { get; set; }

        public UpdateFirmDateCommand(int id, DateTime StartTime, DateTime EndTime)
        {
            Id = id;
            startTime = StartTime;
            endTime = EndTime;
        }
    }
        
    
}

This is the Handler:

using EnocaChallengeV2.Commands;
using EnocaChallengeV2.Models;
using EnocaChallengeV2.Queries;
using EnocaChallengeV2.Repositories;
using MediatR;

namespace EnocaChallengeV2.Handlers
{
    public class UpdateFirmDateHandler : IRequestHandler<UpdateFirmDateCommand, int>
    {
        private readonly IFirmRepository _firmRepository;
        public UpdateFirmDateHandler(IFirmRepository firmRepository)
        {
            _firmRepository = firmRepository;
        }
        public async Task<int> Handle(UpdateFirmDateCommand command, CancellationToken cancellationToken)
        {
            var firm = await _firmRepository.GetFirmByIdAsync(command.Id);
            if (firm == null)
                return default;

            firm.startTime = command.startTime;
            firm.endTime = command.endTime;

            return await _firmRepository.UpdateFirmDateAsync(firm);
        }
    }
}

This is the interface:

using EnocaChallengeV2.Models;

namespace EnocaChallengeV2.Repositories
{
    public interface IFirmRepository
    {
        public Task<List<Firm>> GetFirmListAsync();
        public Task<Firm> GetFirmByIdAsync(int Id);
        public Task<Firm> AddFirmAsync(Firm firm);
        public Task<int> UpdateFirmDateAsync(Firm firm);
        public Task<int> UpdateFirmVerificationAsync(Firm firm);
    }
}

This is the repository:

using EnocaChallengeV2.Data;
using EnocaChallengeV2.Models;
using Microsoft.EntityFrameworkCore;

namespace EnocaChallengeV2.Repositories
{
    public class FirmRepository : IFirmRepository
    {
        private readonly DbContextClass _dbContext;

        public FirmRepository(DbContextClass dbContext)
        {
            _dbContext = dbContext;
        }

        public async Task<Firm> AddFirmAsync(Firm firm)
        {
            var result = _dbContext.Firms.Add(firm);
            await _dbContext.SaveChangesAsync();
            return result.Entity;
        }

        public async Task<int> DeleteFirmAsync(int Id)
        {
            var filteredData = _dbContext.Firms.Where(x => x.Id == Id).FirstOrDefault();
            _dbContext.Firms.Remove(filteredData);
            return await _dbContext.SaveChangesAsync();
        }

        public async Task<Firm> GetFirmByIdAsync(int Id)
        {
            return await _dbContext.Firms.Where(x => x.Id == Id).FirstOrDefaultAsync();
        }

        public async Task<List<Firm>> GetFirmListAsync()
        {
            return await _dbContext.Firms.ToListAsync();
        }

        public async Task<int> UpdateFirmDateByIdAsync(Firm firm)
        {
            _dbContext.Firms.Update(firm);
            return await _dbContext.SaveChangesAsync();
        }

        //public async Task<Firm> UpdateFirmVerificationAsync(Firm firm)
        //{
        //    _dbContext.Firms.Update(firm);
        //    return await _dbContext.SaveChangesAsync();
        //}
    }
}

I tried to change the Task<> to Firm and then to int but didn’t seem to work.

>Solution :

You command needs to define a return type of ‘int’:

namespace EnocaChallengeV2.Commands
{
    public class UpdateFirmDateCommand : IRequest<int> {
        public int Id { get; set; }
        public DateTime startTime { get; set; }
        public DateTime endTime { get; set; }

        public UpdateFirmDateCommand(int id, DateTime StartTime, DateTime EndTime)
        {
            Id = id;
            startTime = StartTime;
            endTime = EndTime;
        }
    }
}

Note the change:

IRequest<int>

Leave a Reply