如何使用Entity Framework和Membership表初始化数据库

Pat*_*ins 22 asp.net-mvc entity-framework asp.net-membership asp.net-mvc-4 entity-framework-5

我有一个使用Entity Framework 5.0 Code First的MVC4 Web应用程序.

在Global.asax.cs中,我有一个初始化Entity.Database的引导程序,强制初始化数据库并初始化成员资格数据库.代码是这样的:

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我无法通过以下方式为会员创建用户:

WebSecurity.InitializeDatabaseConnection(DEFAULTCONNECTION, "UserProfile", "UserId", "UserName", autoCreateTables: true);
Run Code Online (Sandbox Code Playgroud)

因为我有一个问题,即没有创建数据库.如何使用Entity Framework 5.0和Asp.Net MVC 4初始化数据库的某些默认用户?

Dar*_*rov 35

请查看以下文章,了解使用迁移为数据库设定种子的建议方法.

以下是步骤:

  1. 使用Internet模板创建新的ASP.NET MVC 4应用程序
  2. 在包管理器控制台中,键入以下命令:

    enable-migrations
    
    Run Code Online (Sandbox Code Playgroud)
  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" });
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在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>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在包管理器控制台中运行迁移:

    update-database -verbose
    
    Run Code Online (Sandbox Code Playgroud)

  • @Darin:很抱歉提出一个较旧的问题,但如果你从网络项目中分离出EF上下文,这仍然适用吗?我无法想象您会引用WebMatrix.*和System.Web.Security作为创建不应该存在于数据级别的依赖项...(也许我应该对此提出疑问?) (3认同)
  • AutomaticMigrationsEnabled = true; 是非常可怕的使用.每当您更改代码优先的DbContext时,它都会自动迁移数据库,并且永远不应在生产环境中使用.从破坏DB中的更改中恢复非常困难,因为您没有要从中追溯的迁移步骤.而是使用"添加迁移"将每次更改的迁移步骤显式添加到代码优先的数据库模型. (2认同)