【问题标题】:How to initialize database with Entity Framework and Membership tables如何使用实体框架和成员表初始化数据库
【发布时间】:2012-09-21 16:06:42
【问题描述】:

我有一个使用 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);

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 为数据库初始化一些默认用户?

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-membership asp.net-mvc-4 entity-framework-5


    【解决方案1】:

    查看following article,了解使用迁移为数据库播种的推荐方法。

    步骤如下:

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

      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 中指定成员和角色提供者:

      <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
      

    【讨论】:

    • 嗨,我可以让这个解决方案半途而废。事实上,我必须运行 update-database 两次,因为第一次创建数据库而不是表。我收到登录请求的错误“无法打开数据库“WorkoutPlannerDb”。登录失败。”我猜是因为 InitializeDatabaseConnection 重新打开了一个新连接而不是使用第一个连接?
    • AutomaticMigrationsEnabled = true;用起来很吓人。每当您更改代码优先的 DbContext 时,它都会自动迁移数据库,并且永远不应在生产环境中使用。从数据库中的重大更改中恢复是极其困难的,因为您没有可追溯的迁移步骤。而是使用“add-migration”为代码优先数据库模型的每个更改显式添加迁移步骤。
    • @Darin:很抱歉提出一个较老的问题,但是如果您将 EF 上下文从您的 Web 项目中分离出来,这仍然适用吗?我无法想象您会引用 WebMatrix.* 和 System.Web.Security,因为它们创建了不应该存在于数据级别的依赖项......(也许我应该为此提出一个问题?)
    • @BradChristie - 你有没有找到上一个问题的答案?我正在尝试将我的所有数据库数据播种到“核心”项目中,然后只使用来自用户界面项目(例如 Web、移动设备等)的数据。你有什么进步?
    • 这个网站接近我正在寻找的东西,但我仍然认为缺少一些东西。有没有人觉得我们在数据访问层引用了 WebSecurity 命名空间很奇怪?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多