自定义标识用户和扩展配置文件MVC

Par*_*wej 16 c# asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity

我试图在单独的表中扩展身份用户数据,但它没有填充.

  public class MyUserInfo
  {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

  }

  public class AppUser : IdentityUser<Int32, AppUserLogin, AppUserRole, AppUserClaim>
  {

    public MyUserInfo MyUserInfo { get; set; }
 }

//Fetching the user data

var userStore = new UserStore<AppUser, AppRole, int, AppUserLogin, AppUserRole, AppUserClaim>(db);
var userManager = new UserManager<AppUser, int>(userStore);

var user = userManager.FindById(1);
Run Code Online (Sandbox Code Playgroud)

user.MyUserInfo显示null.但是在db中,我们有各自的用户数据.

我看到许多帖子没有自定义似乎工作,但对我来说,我修改了存储为整数的id并更改了表名.

Dav*_*ich 6

库存标识UserManager不会自动拉UserInfo(或任何其他表实体与外键导航)

您已扩展了身份模式,但尚未扩展UserManager.

的无的UserManager的一些方法来获取用户(例如findbyid(),FindByIdAsync())检索由实体框架导航'子’的实体.

看看GitHub FindByIdAsync

    public virtual Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
    {
        cancellationToken.ThrowIfCancellationRequested();
        ThrowIfDisposed();
        var id = ConvertIdFromString(userId);
        return Users.FirstOrDefaultAsync(u => u.Id.Equals(id), cancellationToken);
    }
Run Code Online (Sandbox Code Playgroud)

该方法仅返回用户实体.没有检查"子"导航表的功能,更不用说拉它们了.


您可以通过实现这样的方法来扩展UserManager.

否则,您必须在检索后手动拉出子实体UserId.我就这样做了:

            var UserId = User.Identity.GetUserId<int>();

            try
            {
                user = await UserManager.FindByIdAsync(UserId );
            }
            catch (Exception e)
            {
                return BadRequest(e.Message);
            }

            var userInfo = AuthContext.UserInfo.
                   FirstOrDefault(u => u.Id == user.UserInfo_Id);
Run Code Online (Sandbox Code Playgroud)

注意:我还必须确保ApplicationUser我的UserInfo实体有一个外键:

public class ApplicationUser : IdentityUser
{
    [ForeignKey("UserInfo")]
    public int UserInfo_Id { get; set; }

    public virtual UserInfo UserInfo { get; set; }
Run Code Online (Sandbox Code Playgroud)

在我的模型构建器中

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ApplicationUser>()
          .HasRequired<UserInfo>(profile => profile.UserInfo);


        base.OnModelCreating(modelBuilder);
    }
Run Code Online (Sandbox Code Playgroud)


tmg*_*tmg 2

我认为这里的问题并不严格与 ASP.NET 身份有关,而是与实体框架有关。由于您从中获取数据 userManager.FindById(1),但没有从MyUserInfo表中获取相关数据,导致关系不存在。

MyUserInfo将实体更改为

public class MyUserInfo
{
    //change it from Id to AppUserId
    public int AppUserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }   
    //add this virtual property
    public virtual AppUser User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后添加迁移并更新数据库。实体框架将在表之间建立关系并将其AppUserId作为外键(代码优先关系约定)。