21

Mam aplikację internetową MVC4 które używają Entity Framework 5.0 kod najpierw.Jak zainicjować bazy danych z Entity Framework i członkostwa w tabelach

W Global.asax.cs Mam bootstrapper, który inicjuje Entity.Database, wymusza inicjalizację bazy danych i zainicjalizowanie bazy danych dla Członkostwa. Kod jest to jedno:

System.Data.Entity.Database.SetInitializer(new DatabaseContextInitializer()); 
Database.Initialize(true); 
WebSecurity.InitializeDatabaseConnection(DEFAULTCONNECTION, "UserProfile", "UserId", "UserName", autoCreateTables: true); 

DatabaseContextInitializer jest bardzo prosty w tej chwili:

public class DatabaseContextInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext> 
{ 
    protected override void Seed(DatabaseContext dbContext) 
    { 
     base.Seed(dbContext); 
     db.Set<Workout>().Add(new Workout {Id = 1, Name = "My First workout user1"}) 

    } 
} 

Problem polega na tym, że nie można utworzyć użytkownika do członkostwa z:

WebSecurity.InitializeDatabaseConnection(DEFAULTCONNECTION, "UserProfile", "UserId", "UserName", autoCreateTables: true); 

Bo Mam problem z tym, że baza danych nie została utworzona. Jak zainicjować niektóre domyślne użytkownika dla bazy danych z Entity Framework 5.0 i Asp.Net MVC 4?

Odpowiedz

33

Spójrz na following article dla zalecanego podejścia do wysiewu bazy danych przy użyciu migracje.

Oto kroki:

  1. Tworzenie nowej aplikacji ASP.NET MVC 4 pomocą szablonu internetowego
  2. w opakowaniu typu menedżer konsoli następujące polecenie:

    enable-migrations 
    
  3. Spowoduje to utworzenie pliku ~/Migrations/Configuration.cs w którym można materiału siewnego bazy danych:

    using System.Data.Entity.Migrations; 
    using System.Linq; 
    using System.Web.Security; 
    using WebMatrix.WebData; 
    
    internal sealed class Configuration : DbMigrationsConfiguration<MvcApplication1.Models.UsersContext> 
    { 
        public Configuration() 
        { 
         AutomaticMigrationsEnabled = true; 
        } 
    
        protected override void Seed(MvcApplication1.Models.UsersContext context) 
        { 
         WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
    
         if (!Roles.RoleExists("Administrator")) 
         { 
          Roles.CreateRole("Administrator"); 
         } 
    
         if (!WebSecurity.UserExists("john")) 
         { 
          WebSecurity.CreateUserAndAccount("john", "secret"); 
         } 
    
         if (!Roles.GetRolesForUser("john").Contains("Administrator")) 
         { 
          Roles.AddUsersToRoles(new[] { "john" }, new[] { "Administrator" }); 
         } 
        } 
    } 
    
  4. Określ memebership i dostawców rolę w web.config:

    <roleManager enabled="true" defaultProvider="SimpleRoleProvider"> 
        <providers> 
        <clear/> 
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> 
        </providers> 
    </roleManager> 
    <membership defaultProvider="SimpleMembershipProvider"> 
        <providers> 
        <clear/> 
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" /> 
        </providers> 
    </membership> 
    
  5. Run migracja w konsoli Menedżer pakietów:

    update-database -verbose 
    
+0

Cześć, mogę zrobić to rozwiązanie w połowie drogi. W rzeczywistości dwukrotnie uruchamiam aktualizację bazy danych, ponieważ po raz pierwszy tworzona jest baza danych, ale nie tabele. Mam błąd "Nie mogę otworzyć bazy danych" WorkoutPlannerDb "żądany przez login. Logowanie nie powiodło się." Chyba dlatego, że InitializeDatabaseConnection ponownie otworzyć nowe połączenie zamiast używać pierwszego? –

+2

AutomaticMigrationsEnabled = true; jest bardzo przerażający w użyciu. Automatycznie migruje bazę danych za każdym razem, gdy zmieniasz pierwszy kod DbContext i nigdy nie należy go używać w środowisku produkcyjnym. Bardzo trudno jest wyleczyć się z łamania zmian w DB, ponieważ nie masz żadnych kroków migracyjnych, aby powrócić z powrotem. Zamiast tego użyj "add-migration", aby jawnie dodać kroki migracji dla każdej zmiany modelu kodu pierwszego DB. – angularsen

+3

@Darin: Przepraszam, że mogę podać starsze pytanie, ale czy nadal będzie to miało zastosowanie, jeśli oddzielisz kontekst EF od swojego projektu internetowego? Nie mogę sobie wyobrazić, że odwołujesz się do WebMatrix. * I System.Web.Security, jako że stworzyły zależności, które nie powinny istnieć na poziomie danych ... (Może powinienem zadać pytanie na ten temat?) –

Powiązane problemy