如何告诉UserManager.FindByNameAsync包含关系?

时间:2015-08-13 20:14:57

标签: entity-framework asp.net-identity asp.net-identity-3

我将ASP.NET Identity 2.2.0与ASP.NET MVC 5.2.3和Entity Framework 6.1.2一起使用。

我使用带有Code First的ASP.NET Identity将新属性及其相应的表添加到我的数据库中,如下所示:

public class ApplicationUser
{
  [ForeignKey("UserTypeId")]
  public UserType Type { get; set;}
  public int UserTypeId { get; set;} 
}

public class UserType
{
  [Key]
  public int Id { get; set;}

  public string Name { get; set; }
}

现在,从某个动作开始,当我打电话时:

var user = UserManager.FindByNameAsync(userName);

它确实为用户提供了正确的UserTypeId,因为这是一个原语,但它不会获得UserType类的ApplicationUser属性。

如果我没有使用这种抽象,我会在实体框架中调用LoadProperty<T>Include方法来包含名为Type的导航属性或关系(类型为{{1}在UserType类上。

如何使用ASP.NET Identity ApplicationUser执行此操作?我怀疑唯一的方法是在我的自定义UserManager派生类中重写此方法并自己完成?

1 个答案:

答案 0 :(得分:5)

使用实体框架延迟加载,您需要确保导航属性标记为virtual

public class ApplicationUser
{
    [ForeignKey("UserTypeId")]
    public virtual UserType Type { get; set;}
    public int UserTypeId { get; set;} 
}

或者,如果您不能/不想使用延迟加载,那么您仍然可以像使用任何其他实体一样使用您的上下文:

var user = context.Users.Include(u => u.Type).Single(u => u.UserName == userName);