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并更改了表名.
库存标识UserManager不会自动拉UserInfo(或任何其他表实体与外键导航)
您已扩展了身份模式,但尚未扩展UserManager.
的无的UserManager的一些方法来获取用户(例如findbyid(),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)
我认为这里的问题并不严格与 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作为外键(代码优先关系约定)。
| 归档时间: |
|
| 查看次数: |
2587 次 |
| 最近记录: |