“角色”这个名称在当前上下文中不存在

时间:2013-05-08 17:17:02

标签: c# asp.net-mvc-4 ef-migrations simplemembership

我已将Migrations从网络应用移植到类库项目。 一切正常,但我无法调用static class Roles

我已经包含了using System.Web.Security;所在的名称空间Roles

这是Configuration.cs文件内容:

namespace _DataContext.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    using WebMatrix.WebData;
    using System.Web.Security;

internal sealed class Configuration : DbMigrationsConfiguration<_DataContext.DataContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(_DataContext.DataContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //

        SeedMembership();
    }

    private void SeedMembership()
    {
        WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

        // doesn't work either:
        //var roles = (SimpleRoleProvider)Roles.Provider;
        //var membership = (SimpleMembershipProvider)Membership.Provider;

        if (Roles.RoleExists("Administrator"))
          Roles.CreateRole("Administrator");
    }
  }
}

错误信息是:

The name 'Roles' does not exist in the current context

我在这里缺少什么?

[编辑]

我一直在做更多的研究,似乎我必须从SimpleRoleProvider创建一个对象才能访问RoleExists方法。

但为什么我必须这样做呢?为什么我不能使用:

if (Roles.RoleExists("Administrator"))              
   Roles.CreateRole("Administrator");

Roles来自static class

3 个答案:

答案 0 :(得分:3)

您是否已将roleManager元素添加到system.web文件的Web.config部分?来自the MSDN page on Roles

  

要为ASP.NET应用程序启用角色管理,请使用应用程序的Web.config文件中system.web部分的roleManager元素,如以下示例所示。

该部分如下所示:

  <roleManager defaultProvider="SqlProvider" 
    enabled="true"
    cacheRolesInCookie="true"
    cookieName=".ASPROLES"
    cookieTimeout="30"
    cookiePath="/"
    cookieRequireSSL="false"
    cookieSlidingExpiration="true"
    cookieProtection="All" >
    <providers>
      <add
        name="SqlProvider"
        type="System.Web.Security.SqlRoleProvider"
        connectionStringName="SqlServices"
        applicationName="SampleApplication" />
      </providers>
    </roleManager>

答案 1 :(得分:1)

您应该可以直接访问角色,但在使用 SimpleMembership 提供程序时,我不建议您这样做。话虽如此,您是否在项目中引用了程序集 System.Web

获取角色提供程序的首选方法是执行以下操作:

  var roles = (WebMatrix.WebData.SimpleRoleProvider)Roles.Provider;

  if (!roles.RoleExists("Admin"))
  {
      roles.CreateRole("Admin");
  }

如果您比较角色 SimpleRoleProvider 的定义,您会发现存在很多差异。看起来 SimpleRoleProvider 没有实现 Roles 的完整界面,这在实现自定义提供程序时不是必需的。如果直接从Roles调用它们,您可能会在某些方法上遇到“未实现”的异常。 SimpleRoleProvider 还提供了在使用 SimpleMembership 时非常有用的其他方法/属性。

答案 2 :(得分:0)

您正在使用类库项目中的种子方法。

您必须添加两个参考

1. System.Web
2. System.Web.ApplicationServices

然后从这些引用中解析Roles,Membership。