2013-07-26 64 views
1

我使用的是ASP.NET Membership,我有一个名为UserProfiles的表,它与UserId上的aspnet_Users有1:1的关系,用于存储大量额外的字段。其中一个字段为OrganisationID,这些字段将用于几乎每个页面,并与常规角色一起用于授权目的。主页属性和性能

所以我需要经常检查登录用户的OrganisationID。我不想为此使用Session,我宁愿使用Membership cookie并每次调用数据库。

多少性能损失的将是对网站的母版页以下属性:

public UserProfile loggedInUser 
{ 
    get 
    { 
     if (HttpContext.Current.User.Identity.IsAuthenticated) 
     { 
      if (Membership.GetUser() != null) 
      { 
       Guid userId = (Guid)Membership.GetUser().ProviderUserKey; 
       using (var db = new DatabaseContext()) 
       { 
        return db.UserProfiles.Where(l => l.UserId == userId).FirstOrDefault(); 
       } 
      } 
     } 
     return null; 
    } 
} 

该网站是不是大规模,交通不会是巨大的。这是一个好方法吗?

回答

0

你可以使用.Find而不是.Where,一般来说,a better approach when getting a single entity by it's primary key(就像你的例子)。

我怀疑它会有所作为,因为你每次都在创建一个新的上下文。如果是我,我可能会尝试通过依赖注入(使用每个webrequest生存期或类似的)注入DbContext,然后使用Find。这样,如果多次使用这个属性,它将少得多的开销。

我很好奇,为什么你不想为此使用会话变量?你是否担心增加会话的大小?正如你所说,这不是一个大规模的网站,这是一个用户模型。

+0

欣赏见解。我会小提琴,稍后再回来。我只是不相信会话 - 通常用它作为最后的手段 - 与它的大小无关。 – user982119