0

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

4

3 回答 3

3

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

要为您的 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>
于 2013-05-09T13:06:49.597 回答
1

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

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

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

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

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

于 2013-05-09T15:10:17.970 回答
0

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

您必须添加两个参考

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

然后从这些引用中解析角色、成员资格。

于 2013-09-01T06:17:11.697 回答