3

所以我有基本的 MVC 4 Internet 应用程序项目和 Entity Framework 5。

我已经为用户配置了使用我的表的 WebSecurity。

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "Id", "Email", autoCreateTables: true);

然后在我的迁移配置类中,我使用新角色为 DB 播种并向它们添加用户。

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

    protected override void Seed(Infrastructure.KlepecV2Db context)
    {
        if(!Roles.RoleExists("Admin"))
        {
            Roles.CreateRole("Admin");
        }
        if (!Roles.RoleExists("Test1"))
        {
            Roles.CreateRole("Test1");
        }
        if(Membership.GetUser("user1") != null)
        {
            if(!Roles.IsUserInRole("user1","Admin"))
            {
                Roles.AddUserToRole("user1", "Admin");
            }
        }
        if (Membership.GetUser("user2") != null)
        {
            if (!Roles.IsUserInRole("user2", "Admin"))
            {
                Roles.AddUserToRole("user2", "Admin");
            }
        }
    }
}

因此,当我在 NuGet 控制台中键入“update-database”时,所有内容都会毫无错误地执行。但是,如果我查看 pages_Roles 表,它是空的。pages_UsersInRoles 也是空的。

为了测试,我删除了 Role.RoleExists() 调用并且更新数据库失败,因为角色已经存在。

我在这里想念什么?这个角色存储在哪里?

4

2 回答 2

4

我遇到了The Role Manager feature has not been enabled@Magnus 提到的一个错误。希望这可能与您的角色问题有关,其中默认角色提供者未知。

The Role Manager feature has not been enabled当我WebSecurity.InitializeDatabaseConnection方法从 MVC 项目移动到类库(数据访问)以进行代码优先迁移种子时,发生了错误。

关键是App.config需要配置包管理器Update-Database命令才能像Web.config存在时一样运行。

下面是我的App.configSeed。注意

  1. 我添加"DefaultConnection"连接字符串*
  2. 添加system.web->roleManager以设置enable="true"
  3. 添加以通过提供完整的程序集名称runtime->assemblyBinding->qualifyAssembly来提示编译器在哪里。WebMatrix.WebData

应用程序配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <!--<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Db;Persist Security Info=True;User=user;Password=pass" providerName="System.Data.SqlClient" />-->
  </connectionStrings>
  <system.web>
    <roleManager enabled="true" defaultProvider="simple">
      <providers>
        <clear />
        <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>
    <membership defaultProvider="simple">
      <providers>
        <clear />
        <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <qualifyAssembly partialName="WebMatrix.WebData" fullName="WebMatrix.WebData, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

种子方法:

protected override void Seed(DatabaseContext context)
{
    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "Id", "Email", autoCreateTables: true);

    if(!Roles.RoleExists("Admin"))
    {
        Roles.CreateRole("Admin");
    }
    if (!Roles.RoleExists("Test1"))
    {
        Roles.CreateRole("Test1");
    }
    if(Membership.GetUser("user1") != null)
    {
        if(!Roles.IsUserInRole("user1","Admin"))
        {
            Roles.AddUserToRole("user1", "Admin");
        }
    }
    if (Membership.GetUser("user2") != null)
    {
        if (!Roles.IsUserInRole("user2", "Admin"))
        {
            Roles.AddUserToRole("user2", "Admin");
        }
    }
}

希望这将有助于The Role Manager feature has not been enabled在类库中使用代码优先迁移种子时遇到问题的任何人。

更新

*EF5 将读取 Mvc 项目的 Web.config 中的连接字符串,但不会读取带有 EF 迁移的项目的 App.config 中的连接字符串。但是,EF 迁移项目中仍然需要membershipand设置。roleManager

于 2013-01-07T22:16:37.123 回答
0

想在对话中增加我的 0.02 美元。我有与 CallMeLaNN 类似的设置,但仍然出现错误。我的解决方案是将我的“数据”项目设置为启动项目。之后,我的 app.config 文件开始被拾取,我现在可以从Update-Database命令中为我的用户播种。

于 2013-07-23T15:10:51.753 回答