Включить свойство в 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>()));

Возможно, мне также придется переопределить некоторые другие методы получения, чтобы включить записи о клиентах.

Другие вопросы по тегам