21

我有一個使用Entity Framework 5.0 Code First的MVC4 Web應用程序。如何用Entity Framework和Membership表初始化數據庫

在Global.asax.cs中,我有一個初始化Entity.Database的引導程序,強制初始化數據庫並初始化成員資格數據庫。該代碼是這一個:

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

的DatabaseContextInitializer是當下非常簡單:

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

    } 
} 

的問題是,我不能創建用戶與成員:

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

因爲我有一個數據庫沒有創建的問題。如何使用Entity Framework 5.0和Asp.Net MVC 4爲數據庫初始化一些默認用戶?

回答

33

查看following article,瞭解使用遷移爲種子數據庫推薦的方法。

步驟如下:

  1. 創建一個使用互聯網的模板
  2. 在你的包管理控制檯,鍵入以下命令一個新的ASP.NET MVC應用4:

    enable-migrations 
    
  3. 這將創建一個~/Migrations/Configuration.cs文件,您可以在其中創建數據庫的種子:

    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. 指定你的web.config中memebership和角色提供:

    <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. 運行遷移包管理器控制檯:

    update-database -verbose 
    
+0

嗨,我可以讓這個解決方案一半。實際上,我已經運行了兩次update-database,因爲第一次創建數據庫而不是表格。我有錯誤「無法打開數據庫」WorkoutPlannerDb「請求登錄。登錄失敗。」我想這是因爲InitializeDatabaseConnection重新打開一個新的連接,而不是使用第一個連接? –

+2

AutomaticMigrationsEnabled = true;是非常可怕的使用。無論何時您更改代碼優先的DbContext,它都會自動遷移數據庫,並且絕不應在生產環境中使用它。由於您沒有任何遷移步驟可以追溯,因此要從數據庫中的更改中恢復非常困難。相反,使用「添加遷移」爲每個變更顯式添加遷移步驟,以便實現代碼優先DB模型。 – angularsen

+3

@Darin:抱歉提出一個較老的問題,但如果您從Web項目中分離出EF環境,這仍然適用嗎?我無法想象你會引用WebMatrix。*和System.Web.Security,因爲它創建了不應該存在於數據級別的依賴關係......(也許我應該爲此提出問題?) –

相關問題