我已将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
?
答案 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。