1

我正在使用ASP.NET Membership并且我有一个名为的表,它与onUserProfiles具有 1:1 的关系,以存储许多额外的字段。其中一个字段将在几乎每个页面上与常规角色一起用于授权目的。aspnet_UsersUserIdOrganisationID

所以我需要经常检查登录用户的OrganizationID。我不想为此使用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;
    }
}

该网站并不庞大,流量也不会很大。考虑到这是一个好的方法吗?

4

1 回答 1

0

您可以使用 .Find 而不是 .Where,这通常是通过主键获取单个实体的更好方法(如您的示例)。

我怀疑它会产生什么不同,因为你每次都在创建一个新的上下文。如果是我,我可能会尝试通过依赖注入(使用每个 webrequest 生命周期或类似的)注入 DbContext,然后使用 Find。这样,如果您多次使用此属性,开销将大大减少。

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

于 2013-07-26T18:25:52.940 回答