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,因为它创建了不应该存在于数据级别的依赖关系......(也许我应该为此提出问题?) –

相关问题