1

私は、MVC4 の外にドメインを持つのが好きです。したがって、私の移行フォルダーはドメイン プロジェクトにあります。

他のみんなと同じように、次を使用して Web セキュリティによって作成されたテーブルをシードしたいと思います 。 -4.aspx

SimpleMembershipProvider によって作成されたテーブルは dbContext に公開されません。これらのテーブルをシードする唯一の方法は、リンクのコードを使用することです。明らかに、このコードは私のドメイン プロジェクトでは機能しません。

移行を使用するときに MVC4 の外部にドメイン プロジェクトがあると、SimpleMembershipProvider を使用できなくなりますか? または、これら 3 つのことを組み合わせる適切な方法はありますか?

MVC4 に移行したばかりなので、それが少しばかげた質問である場合は申し訳ありません。ありがとう

4

1 に答える 1

0

私は同じ問題に直面しており、私が思いついた解決策は、コンフィギュレーターでシードイベントを公開し、アプリケーションに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" });
    }
于 2013-03-14T15:48:07.163 に答える