2010-01-15 59 views
1

我有一个roleprovider设置如下使用DataContext。在我的观点,我有以下用户控制...Odd RoleProvider行为

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<% 
    if (Request.IsAuthenticated) { 
%> 
     Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>! 
     <%= Html.ActionLink("Logout", "Logout", "Membership") %> | (
     <% 
      var roles = System.Web.Security.Roles.GetRolesForUser(Page.User.Identity.Name); 
      foreach (string role in roles) 
       Html.Encode(role); 
     %> 
     ) 

现在,如果我在我的本地计算机上运行它,它工作正常。请注意,连接到与我的远程盒子相同的数据库。它登录并显示成员所属的角色。

如果我在远程盒子上运行,使用SAME数据库,它将登录并显示成员名称 - 但是...它不呈现角色。任何想法,为什么这可能会发生?我的角色提供者在下面列出。

using System; 
using System.Linq; 

using System.Collections; 
using System.Collections.Generic; 

namespace Providers 
{ 
    public partial class RoleProvider : System.Web.Security.RoleProvider 
    { 
     private readonly Models.Contexts.DatabaseDataContext dataContext; 

     protected Models.Contexts.DatabaseDataContext DataContext 
     { 
      get { return dataContext; } 
     } 

     public RoleProvider() 
      : base() 
     { 
      if (dataContext == null) 
       dataContext = new DataContextProvider().GetDataContext<Models.Contexts.DatabaseDataContext>("contextProvider"); 
     } 

     public RoleProvider(IDataContextProvider dataContextProvider) 
      : this() 
     { 
      dataContext = dataContextProvider.GetDataContext<Models.Contexts.DatabaseDataContext>("contextProvider"); 
     } 

     public override string[] GetRolesForUser(string email) 
     { 
      DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 
      var member = (
       from m in DataContext.Users 
       where m.Email == email 
       select m).Single(); 

      List<string> roleList = new List<string>(); 
      foreach (Models.Group group in member.Groups) 
       roleList.Add(group.Role.RoleName); 

      return roleList.ToArray<string>(); 
     } 
} 

回答

2

我就老老实实通过查看数据库中的数据差异开始,这听起来愚蠢的,但也许是角色不实际存在或ApplicationIds是不同的。如果需要,使用不同的数据库针对应用程序运行SQL Profiler并验证查询是否相同,并且返回的数据是相同的。