#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()