Преобразовать или создать TUser в UserStore из DBObject в Asp.net идентификатор mvc 5 «Неявно преобразовать тип»

#c# #generics #asp.net-mvc-5 #entity-framework-6 #asp.net-identity

#c# #обобщения #asp.net-mvc-5 #entity-framework-6 #asp.net-идентификатор

Вопрос:

Я новичок в Asp.Net Identity и работаю над созданием собственного пользовательского хранилища, но не могу заставить TUser играть. Сначала у меня есть база данных EntityFramework6 в серверной части, и я получаю данные оттуда без проблем. Моя проблема заключается в преобразовании объекта, который я получаю из EF6, в TUser. Я расскажу вам о том, что у меня есть.

1) AccountController вызывает PasswordSignInAsync в SignInManager

 _signInManager.PasswordSignInAsync(LoginAuditLog);
  

2) Вызвать FindByNameAsync в моем диспетчере пользователей

 await this.UserManager.FindByNameAsync(LoginAuditLog.UserName); 
  

3) затем в моем пользовательском хранилище у меня есть

   public Task<TUser> FindByNameAsync(string userName)
    {
        return Task.FromResult(_userTable.Login(userName));
    }
  

4) Когда он попадает в _userTable.Login() выполняет вызов базы данных и возвращает нужный мне объект, но получение объекта для преобразования в TUser — это моя проблема.

     public TUser Login(string userName)
    {
        TUser y = _unitOfWork.WebPortalUsers.FindByUserName(userName);

        return y;
    }
  

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

Ответ №1:

Ваш метод FindByUserName возвращает WebPortalUser тип экземпляра, которому вы неявно присваиваете его TUser . Вам либо нужно привести его к TUser , если оба типа имеют отношение родитель-потомок, например:

  TUser y = _unitOfWork.WebPortalUsers.FindByUserName(userName) as TUser;

 return y;
  

или, если это не так, вам нужно будет создать экземпляр и явно задать требуемые свойства или использовать средство отображения, подобное AutoMapper, но для этого тип свойств в обоих классах должен быть одинаковым:

 var user = _unitOfWork.WebPortalUsers.FindByUserName(userName);

TUser y = new TUser();
y.Username = user.Username;
.....
.....
// other properties
  

Надеюсь, это дает некоторое представление.

Ответ №2:

Спасибо, @Ehsan это действительно помогает и было частью моей проблемы. Я знал, что это больше связано с основами C #, чем с ASP.Сетевая идентификация или Entity Framework. В итоге я перешел ко второму вашему примеру, создав новый экземпляр TUser, но мне нужно было исправить объявление UserTable и UserStore, чтобы разрешить мне. Моя пользовательская таблица раньше выглядела как

public class UserTable<TUser> where TUser : IdentityMember

и я меняю его на

public class UserTable<TUser> where TUser : IdentityMember, new()