ASP.NET Основной аргумент 1: не удается преобразовать из «длинного» в». Идентичность».Пользователь приложения’

#c# #asp.net-core

#c# #asp.сетевое ядро

Вопрос:

Я пытаюсь получить запись для текущего пользователя, вошедшего в систему ASP.NET Основное приложение веб-API, получая идентификатор пользователя от ApplicationUser в IdentityDbContext.

У меня есть эти услуги:

 public interface IUserService {  string GetCurrentUserId(); }  public class UserService : IUserService {  private readonly IHttpContextAccessor _httpContextAccessor;  private HtmlEncoder _htmlEncoder;   public UserService(  IHttpContextAccessor httpContextAccessor  )  {  _httpContextAccessor = httpContextAccessor;  }  public string GetCurrentUserId()  {  string currentUserId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;  return currentUserId;  } }   public StudentProfileDto FromStudentProfileToStudentDto(Student student)  {  var studentDto = new StudentProfileDto()//;  {  FirstName = student.FirstName,  LastName = student.LastName,  AdmissionNumber = student.AdmissionNumber,  };   return studentDto;  }  

Затем я применил его здесь:

 public interface IStudentService {  public Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(ApplicationUser user = null); }   public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(ApplicationUser user = null)  {  var mapper = new EntityMapper();  var studentProfile = await _unitOfWork.StudentRepository.GetAll();  var studentDtoProfile = studentProfile.Where(x =gt; x.UserId == Convert.ToInt64(user)).Select(c =gt; mapper.FromStudentProfileToStudentDto(c)).ToList();   return studentDtoProfile;  }  

Базовая установка:

 public class BaseRepositorylt;Tgt; : IBaseRepositorylt;Tgt; where T : AuditableBaseEntity {  private readonly DDMDbContext _context;  private DbSetlt;Tgt; _entities;   public BaseRepository(DDMDbContext context)  {  _context = context;  _entities = context.Setlt;Tgt;();  }   public async Tasklt;IEnumerablelt;Tgt;gt; GetAll()  {  var list = await _entities.Where(x =gt; x.IsDeleted == false).ToListAsync();  return list;  }   public async Task Insert(T entity)  {  entity.CreatedDate = DateTime.UtcNow;  entity.IsDeleted = false;  await _entities.AddAsync(entity);  } }  

UnitOfWork:

 public interface IUnitOfWork : IDisposable {  IBaseRepositorylt;Studentgt; StudentRepository { get; }   void SaveChanges();  Task SaveChangesAsync(); }  public class UnitOfWork : IUnitOfWork {  private readonly DDMDbContext _context;   public UnitOfWork(DDMDbContext context)  {  _context = context;  }   private readonly IBaseRepositorylt;Studentgt; _studentRepository;  public IBaseRepositorylt;Studentgt; StudentRepository =gt; _studentRepository ?? new BaseRepositorylt;Studentgt;(_context);  

Затем, наконец, вызвал его из контроллера:

 public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile()  {  long userId = Convert.ToInt64(_userService.GetCurrentUserId());  return await _studentService.GetStudentProfile(userId);  }  

Но я получил эту ошибку:

Ошибка CS1503 Аргумент 1: не удается преобразовать из «длинного» в «Идентичность».Пользователь приложения’

Он выделяет идентификатор пользователя в:

возврата ждут _studentService.GetStudentProfile(идентификатор пользователя);

Что мне нужно сделать, чтобы решить эту проблему?

Обновленный Код:

 public interface IStudentService {  public Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(long? user); }   public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(long? user)  {  var mapper = new EntityMapper();  var studentProfile = await _unitOfWork.StudentRepository.GetAll();  var studentDtoProfile = studentProfile.Where(x =gt; x.UserId == Convert.ToInt64(user)).Select(c =gt; mapper.FromStudentProfileToStudentDto(c)).ToList();   return studentDtoProfile;  }  

Контроллер:

 public async Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile()  {  long userId = Convert.ToInt64(_userService.GetCurrentUserId());  return await _studentService.GetStudentProfile(userId);  }  

Комментарии:

1. Измените Tasklt;IEnumerablelt;StudentProfileDtogt;gt; GetStudentProfile(ApplicationUser user = null) , чтобы принять длинный или добавьте новый метод, который будет.

2. @Jasen — Как и на что мне его изменить?

3. GetStudentProfile(long userId) теперь он принимает длинный параметр.

4. @Jasen — У меня также есть Ienumerable в базовой версии, которую я назвал GetAll(). Как мне добиться этого во всем? Смотрите мой код.

5. Почему вы хотите изменить GetAll() ????

Ответ №1:

В вашем методе GetStudentProfile он принимает пользователя приложения в качестве параметра недолго.

Комментарии:

1. Я сделал это, потому что идентификатор текущего пользователя, который я собираю в ApplicationUser, длинный.

2. Я думаю, что метод должен быть следующим: общедоступная задачаlt;IEnumerablelt;StudentProfileDtogt;lt;StudentProfileDtogt;gt; GetStudentProfile(долго? пользователь); }

3. Если я использую это, я не знаю, как еще я смогу получить идентификатор текущего пользователя.

4. В контроллере вы уже получаете идентификатор пользователя как; длинный идентификатор пользователя = Конвертировать. ToInt64 (_Пользовательская служба. GetCurrentUserId()); что верно. Так что только измените этот параметр метода-это служба

5. Когда я изменил его, как вы советовали, он возвращает пустую запись. И все же есть запись для профиля