私は同じ問題に直面しており、私が思いついた解決策は、コンフィギュレーターでシードイベントを公開し、アプリケーションにSimpleMembershipシードをサブスクライブさせることです。
まず、構成:
internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
public event EventHandler<MyContext> OnSeed;
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyContext context)
{
var onSeed = this.OnSeed;
if (onSeed != null)
onSeed(this, context);
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
}
}
次に、Database.SetInitializerで使用できるようにするために、MigrateDatabaseToLatestVersionに基づいて独自のIDatabaseInitializerを作成しました。この投稿にあるように(そしてここで確認できます)、これはDbMigrationの単なるラッパーであるため、簡単に実行できました。
public class MyDatabaseInitializer : IDatabaseInitializer<MyContext>
{
private readonly Configuration config;
public event EventHandler<MyContext> OnSeed
{
add { if (this.config != null) this.config.OnSeed += value; }
remove { if (this.config != null) this.config.OnSeed -= value; }
}
/// <summary>
/// Initializes a new instance of the MigrateDatabaseToLatestVersion class.
/// </summary>
public MyDatabaseInitializer()
{
this.config = new Configuration();
}
/// <summary>
/// Initializes a new instance of the MigrateDatabaseToLatestVersion class that will
/// use a specific connection string from the configuration file to connect to
/// the database to perform the migration.
/// </summary>
/// <param name="connectionStringName"> The name of the connection string to use for migration. </param>
public MyDatabaseInitializer(string connectionStringName)
{
Contract.Requires(!string.IsNullOrWhiteSpace(connectionStringName));
this.config = new Configuration
{
TargetDatabase = new DbConnectionInfo(connectionStringName)
};
}
/// <inheritdoc />
public void InitializeDatabase(MyContext context)
{
var migrator = new DbMigrator(config);
migrator.Update();
}
}
この初期化子では、OnSeedイベントを公開します。App_StartのMVCプロジェクトで、SimpleMembershipデータをシードするためにサブスクライブします。
var initializer = new PoipDatabaseInitializer();
initializer.OnSeed += (s, e) => SeedSecurity();
Database.SetInitializer(initializer);
private static void SeedSecurity()
{
WebSecurity.InitializeDatabaseConnection("MyDatabase", "UserProfile", "UserId", "UserName", autoCreateTables: false);
if (!Roles.RoleExists("SysAdmin"))
Roles.CreateRole("SysAdmin");
if (!WebSecurity.UserExists("sysadmin"))
WebSecurity.CreateUserAndAccount(
"sysadmin",
"password"
);
if (!Roles.GetRolesForUser("sysadmin").Contains("SysAdmin"))
Roles.AddUsersToRoles(new[] { "sysadmin" }, new[] { "SysAdmin" });
}