Mam więc podstawowy projekt aplikacji internetowej MVC 4 z Entity Framework 5.

Skonfigurowałem WebSecurity, który używa mojej tabeli dla użytkowników.

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

Następnie w mojej klasie konfiguracji migracji zaszczepiam DB nowymi rolami i dodaję do nich użytkowników.

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");
            }
        }
    }
}

Kiedy więc wpisuję „update-database” w konsoli NuGet, wszystko jest wykonywane bez błędów. Ale jeśli zajrzę do tabeli webpages_Roles, jest pusta. Również webpages_UsersInRoles jest pusty.

Do testów usunąłem wywołania Role.RoleExists() i aktualizacja bazy danych nie powiodła się, ponieważ role już istnieją.

Czego mi tu brakuje? Gdzie są przechowywane te role?

3
Gapipro 18 październik 2012, 14:29

2 odpowiedzi

Najlepsza odpowiedź

Natknąłem się na błąd The Role Manager feature has not been enabled wspomniany przez @Magnusa. Mam nadzieję, że prawdopodobnie dotyczy to problemu z twoimi rolami, w którym domyślny dostawca ról jest nieznany.

Błąd The Role Manager feature has not been enabled wystąpił, gdy przenoszę metodę WebSecurity.InitializeDatabaseConnection z projektu MVC do biblioteki klas (dostęp do danych) dla pierwszego źródła migracji kodu.

Chodzi o to, że App.config należy skonfigurować, aby polecenie Menedżera pakietów Update-Database było uruchamiane tak samo, jak w przypadku istnienia Web.config.

Poniżej znajdują się moje App.config i Seed. Zauważ, że

  1. Dodaję ciąg połączenia "DefaultConnection" *
  2. Dodaj system.web->roleManager, aby ustawić enable="true"
  3. Dodaj runtime->assemblyBinding->qualifyAssembly, aby dać wskazówkę kompilatorowi, gdzie jest WebMatrix.WebData, podając pełną nazwę zestawu.

App.Config:

<?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>

Metoda nasion:

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");
        }
    }
}

Mam nadzieję, że pomoże to każdemu, kto ma problem z The Role Manager feature has not been enabled podczas używania pierwszego kodu źródłowego migracji w bibliotece klas.

Aktualizuj

* EF5 odczyta parametry połączenia w Web.config projektu Mvc, ale nie w App.config projektu z migracjami EF. Jednak ustawienia membership i roleManager są nadal wymagane w projekcie migracji EF.

4
CallMeLaNN 13 styczeń 2013, 19:40

Chciałem dodać moje 0,02 $ do rozmowy. Mam podobną konfigurację do CallMeLaNN, ale nadal otrzymuję błąd. Moim rozwiązaniem było ustawienie mojego projektu „Data” na projekt StartUp. Potem mój plik app.config zaczął być pobierany i mogę teraz inicjować moich użytkowników za pomocą polecenia Update-Database.

0
PBG 23 lipiec 2013, 19:10