2014-02-21 58 views
1

好吧,所以我定製了ApplicationUser,我需要在用戶登錄時加載集合,而我只是試圖找到最好的方法來做到這一點。我查看了網絡上的示例,但這些示例僅通過添加自定義屬性(而非集合)來自定義ApplicationUser。當用戶登錄時,我需要加載一個IList <>。我看到了幾種方法來做到這一點,我想知道哪種方法會被認爲是「最好」的方式(我知道這有點主觀,但我認爲這是一個新的理由)。用戶在登錄時加載集合

不管怎樣,在對AcccountController的登錄方法,我們有這樣的:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
      var user = await UserManager.FindAsync(model.UserName, model.Password); 
      if (user != null) 
      { 

       await SignInAsync(user, model.RememberMe); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Invalid username or password."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

我可以在await SigninAsync()後添加一行來加載我的收藏,但似乎浪費,爲的UserManager已經去了數據庫。我真正想要的是通過某種方式告訴用戶管理器,當它爲用戶查詢數據庫時,我的收藏集爲.Include()。我正在看從UserStore<ApplicationUser>繼承並重寫FindByNameAsync()功能由UserManager叫:

public virtual Task<TUser> FindByNameAsync(string userName) 
    { 
     this.ThrowIfDisposed(); 
     IQueryable<TUser> entitySet = 
      from u in this._userStore.EntitySet 
      where u.UserName.ToUpper() == userName.ToUpper() 
      select u; 
     return Task.FromResult<TUser>(entitySet.FirstOrDefault<TUser>()); 
    } 

,並覆蓋它,我使用並加載了我的屬性定製ApplicationUser。這是應該完成的方式,還是我忽略了一些可以更簡單地處理這個事情的地方AspNet.Identity


所以,在我的臉上迅速炸燬了,又好像你不會從UserStore<TUser>繼承並訪問任何,你可能真的想重寫這些方法中的一個時使用,如全部是internalprivate。這麼短的複製和粘貼所有的UserStore<TUser>和重新工作我想要的一種方法是否有任何建議?

回答

1

這裏是這樣做的一種方法:

public class PatientPortalUserStore<TUser> : UserStore<TUser> 
    where TUser : ApplicationUser 
{ 

    public PatientPortalUserStore(DbContext context) : base(context) 
    { 
     this._userStore = new EntityStore<TUser>(context); 
    } 

    private EntityStore<TUser> _userStore; 

    public override Task<TUser> FindByNameAsync(string userName) 
    { 
     //This is the important piece to loading your own collection on login 
     IQueryable<TUser> entitySet = 
      from u in this._userStore.EntitySet.Include(u=>u.MyCustomUserCollection) 
      where u.UserName.ToUpper() == userName.ToUpper() 
      select u; 
     return Task.FromResult<TUser>(entitySet.FirstOrDefault<TUser>()); 
    } 
} 


//Had to define this because EntityStore used by UserStore<TUser> is internal 
class EntityStore<TEntity> 
    where TEntity : class 
{ 
    public DbContext Context 
    { 
     get; 
     private set; 
    } 

    public DbSet<TEntity> DbEntitySet 
    { 
     get; 
     private set; 
    } 

    public IQueryable<TEntity> EntitySet 
    { 
     get 
     { 
      return this.DbEntitySet; 
     } 
    } 

    public EntityStore(DbContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     this.Context = context; 
     this.DbEntitySet = context.Set<TEntity>(); 
    } 

    public void Create(TEntity entity) 
    { 
     this.DbEntitySet.Add(entity); 
    } 

    public void Delete(TEntity entity) 
    { 
     this.Context.Entry<TEntity>(entity).State = EntityState.Deleted; 
    } 

    public virtual Task<TEntity> GetByIdAsync(object id) 
    { 
     return this.DbEntitySet.FindAsync(new object[] { id }); 
    } 
}