Entity Framework 5.0 Code Firstを使用するMVC4 Webアプリケーションがあります。
Global.asax.csには、Entity.Databaseを初期化し、データベースを強制的に初期化し、Membershipのデータベースを初期化するブートストラップがあります。コードは次のとおりです。
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を使用して、データベースのデフォルトユーザーをどのように初期化しますか?
移行を使用してデータベースをシードするための推奨アプローチについては、 次の記事 をご覧ください。
手順は次のとおりです。
パッケージマネージャーコンソールで、次のコマンドを入力します。
enable-migrations
これにより、~/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" });
}
}
}
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>
パッケージマネージャーコンソールで移行を実行します。
update-database -verbose