名字'角色'在当前上下文中不存在

本文关键字:上下文 不存在 角色 名字 | 更新日期: 2023-09-27 18:12:47

我已经将Migrations从web应用程序移植到类库项目。一切都很好,除了我不能调用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 ?

名字'角色'在当前上下文中不存在

您是否将roleManager元素添加到Web.config文件的system.web部分?来自角色的MSDN页面:

为您的ASP启用角色管理。NET应用程序,使用系统的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>

您应该能够直接访问角色,但我不建议在使用 simplembermembership 提供程序时这样做。话虽如此,你们有装配系统吗?Web在您的项目中引用?

获取角色提供者的首选方法是这样做:

  var roles = (WebMatrix.WebData.SimpleRoleProvider)Roles.Provider;
  if (!roles.RoleExists("Admin"))
  {
      roles.CreateRole("Admin");
  }

如果您比较RolesSimpleRoleProvider的定义,您将看到有相当多的差异。看起来,SimpleRoleProvider没有实现Roles的完整接口,这在实现自定义提供程序时是不需要的。如果直接从Roles调用某些方法,可能会得到"未实现"异常。SimpleRoleProvider还提供了在使用SimpleMembership时有用的其他方法/属性。

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

你必须添加两个引用

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

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