从 Asp.net mvc 5 Identity "Connot Implicitly convert type" 中的 DbObject 在 UserStore 中转换或创建 TUser

Convert or Create TUser in UserStore From a DbObject in Asp.net mvc 5 Identity "Connot Implicitly convert type"

我是 Asp.Net Identity 的新手,正在努力创建我自己的 UserStore,但无法让 TUser 玩游戏。我在后端首先有 EntityFramework6 数据库,我从那里获取数据没问题。我的问题是将我从 EF6 获得的对象转换为 TUser。我将向您介绍我所拥有的。

1) AccountController 在 signInManager

中调用 PasswordSignInAsync
_signInManager.PasswordSignInAsync(LoginAuditLog);

2) 在我的用户管理器中调用 FindByNameAsync

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

3) 然后在我的 UserStore 中我有

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

4) 当它到达 _userTable.Login() 时,它会调用 Db 和 return 我想要的对象,但是让对象转换为 TUser 是我的问题。

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

        return y;
    }

我试过通过互联网搜索进行转换、转换和其他内容。我正在获取 Connot Implicitly convert 类型,如果我强制转换或转换,我只会得到此错误的运行时版本。 Snip of error message

您的方法 FindByUserName returns 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

希望它能提供一些想法。

谢谢,@Ehsan 确实有帮助,并且是我的问题的一部分。我知道这更多地与 C# 基础知识有关,然后是 ASP.Net Identity 或 Entity Framework。我结束了你的第二个例子,创建了一个新的 TUser 实例,但我需要修复 UserTable 和 UserStore 的声明让我。我的 UserTable 之前看起来像

public class UserTable<TUser> where TUser : IdentityMember

然后我将其更改为

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