Включить свойство в ASP.Net Identity 2.0 UserManager.Users.ToListAsync и UserManager.FindByIdAsync
Я пытаюсь реализовать Asp.Net Identity 2.0. Мне удалось очень хорошо с помощью этого блога. Но я пошел немного другой дорогой. Я хочу, чтобы некоторые данные были не частью объекта User, а скорее вновь созданным объектом Customer. Я хочу отделить данные аутентификации и авторизации от моих бизнес-данных.
Поэтому в моем случае я изменил класс ApplicationUser, добавив свойство customer:
public Customer Customer { get; set; }
Класс Customer выглядит следующим образом:
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Insertion { get; set; }
public Gender Gender { get; set; }
public DateTime Birthdate { get; set; }
...etc.
public virtual ApplicationUser User { get; set; }
}
Я также добавил отношение в de ApplicationDbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasRequired(u => u.User);
base.OnModelCreating(modelBuilder);
}
Поэтому теперь, после некоторых изменений в регистре viewmodel и контроллере, я могу зарегистрироваться как пользователь, и у меня есть и запись User, созданная в таблице AspNetUsers, и запись Customer в таблице Customer со ссылкой на запись User. Все идет нормально.
Но теперь, когда я извлекаю пользователя, например, для целей отображения, свойство Customer пусто. Что имеет смысл, поскольку основная запись не загружается. Обычно я бы использовал ключевое слово.Include для загрузки связанных записей. Но я не знаю, как это сделать при использовании UserManager по умолчанию, который поставляется с Asp.Net identity 2.0.
Кто-нибудь знает, как этого добиться?
1 ответ
Я нашел ответ. Вероятно, нужно больше искать, прежде чем ответить. Ответ основан на ответе в этом вопросе.
Я добавил класс с именем ApplicationUserStore.
public class ApplicationUserStore : UserStore<ApplicationUser>
{
public ApplicationUserStore(DbContext context)
: base(context)
{
}
public override System.Threading.Tasks.Task<ApplicationUser> FindByIdAsync(string userId)
{
return Users.Include(u=>u.Customer).Include(u => u.Roles).Include(u => u.Claims).Include(u => u.Logins).FirstOrDefaultAsync(u => u.Id == userId);
}
}
В этом классе я переопределил FindByIdAsync, чтобы включить запись о клиенте.
Затем я изменил в IdentityConfig.cs первую строку в методе Create, который возвращает ApplicationUserManager, чтобы он передавал вновь созданный ApplicationUserStore вместо UserStore.
var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get<ApplicationDbContext>()));
Возможно, мне также придется переопределить некоторые другие методы получения, чтобы включить записи о клиентах.