Ответ 1
Идентификатор пользователя UserManager автоматически не вытягивает UserInfo
(или любую другую таблицу Entity с внешней навигацией)
Вы расширили схему идентификации, но вы не расширили UserManager.
Ни один из методов UserManager для получения пользователя (например, findbyid()
, FindByIdAsync()
) не извлекает дочерние объекты с помощью Entity Framework Navigation.
Взгляните на 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);
}
Метод возвращает только User Entity. Нет никакой функции для проверки "дочерних" таблиц навигации, не говоря уже о том, чтобы вытащить их.
Вы можете расширить UserManager, реализовав такой метод.
В противном случае вам придется вручную вытащить дочерний объект Entity после извлечения 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);
Примечание. Я также должен был убедиться, что у моего ApplicationUser
был внешний ключ для моего UserInfo
Entity:
public class ApplicationUser : IdentityUser
{
[ForeignKey("UserInfo")]
public int UserInfo_Id { get; set; }
public virtual UserInfo UserInfo { get; set; }
и в моем построителе моделей
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ApplicationUser>()
.HasRequired<UserInfo>(profile => profile.UserInfo);
base.OnModelCreating(modelBuilder);
}