我正在使用ASP.NET Membership
,我有一个名为UserProfiles
的表,与aspnet_Users
UserId
上的OrganisationID
有1:1的关系,可存储大量额外字段。其中一个字段是Session
,它将在几乎每个页面上与常规角色一起用于授权目的。
所以我需要经常检查登录用户的OrganisationID。我不想使用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;
}
}
,我宁愿使用Membership cookie并且每次都调用数据库。
在网站的母版页上拥有以下属性会有多大的性能影响:
{{1}}
网站规模不大,流量不会很大。这是一个好的方法吗?
答案 0 :(得分:0)
你可以使用.Find而不是.Where,一般来说,a better approach when getting a single entity by it's primary key(就像你的例子)。
我怀疑它会有所不同,因为你每次都在创建一个新的上下文。如果是我,我可能会尝试通过依赖注入(使用每个webrequest生命周期或类似)注入DbContext,然后使用Find。这样,如果您多次使用此属性,那么开销就会少得多。
我很好奇,为什么你不想为此使用会话变量?你是否担心过多增加会话的大小?正如您所说,这不是一个庞大的网站,这是一个按用户模型。