1

私は単純なメンバーシップ プロバイダー (WebMatrix アセンブリ) を使用して認証メカニズムを実装する MVC 4 アプリケーションに取り組んでいます。

アプリケーションを実行すると、userProfiles、ロールなどのテーブルが作成されます。次にやりたいことは、移行を有効にすることです。本質的に、これらの既存のテーブルを DbMigration に追加したいと考えています。

これを行う理由は、update-database コマンドを実行し、いくつかのシード データ (ユーザー、ロールなど) を提供するためです。

ただし、Enable-Migrations を実行するDbMigrationと、WebMatrix によって作成されたテーブル以外のすべてのテーブルを削除および作成するためのコマンドを含むクラスが作成されます。

移行ロジック内にすべてのテーブルを含める方法はありますか?

4

1 に答える 1

3

これは 2 つのステップで行う必要があります。まず、WebMatrix にテーブルを作成させないようにする必要があります。そのためのInitializeDatabaseメソッドへのパラメーターがあります

テーブルの作成について。これらは EF モデルの一部ではないため、Enable-Migrations によって作成されません。

テーブルの作成を最初の移行に追加する必要があります。スクリプトはそのアンサーで利用できます

public partial class AddWebMatrixSecurityTables: DbMigration
{
    public override void Up()
    {
        Sql(@"Create ...");
    }

    public override void Down()
    {
        Sql("Drop....");
    }
}

Fluent API を使用してテーブルを作成する場合は、このコードを使用できます。webpages_Membership と webpages_UsersInRoles の両方への FK を持つ UserProfile テーブルを含めるように変更する必要があります。

using System;
using System.Data.Entity.Migrations;

public partial class AddWebMatrixTables : DbMigration
{
    public override void Up()
    {
        CreateTable(
                "dbo.webpages_Membership",
                c => new
                         {
                                 UserId = c.Int(nullable: false, identity: true),
                                 CreateDate = c.DateTime(nullable: true),
                                 ConfirmationToken = c.String(nullable: true, maxLength: 128),
                                 IsConfirmed = c.Boolean(nullable: true, defaultValue: false),
                                 LastPasswordFailureDate = c.DateTime(nullable: true),
                                 PasswordFailuresSinceLastSuccess = c.Int(nullable: false, defaultValue: 0),
                                 Password = c.String(nullable: false, maxLength: 128),
                                 PasswordChangedDate = c.DateTime(nullable: true),
                                 PasswordSalt = c.String(nullable: false, maxLength: 128),
                                 PasswordVerificationToken = c.String(nullable: true, maxLength: 128),
                                 PasswordVerificationTokenExpirationDate = c.DateTime(nullable: true)
                         })
                .PrimaryKey(t => t.UserId);

        CreateTable(
                "dbo.webpages_OAuthMembership",
                c => new
                         {
                                 Provider = c.String(nullable: false, maxLength: 30),
                                 ProviderUserId = c.String(nullable: false, maxLength: 100),
                                 UserId = c.Int(nullable: false)
                         })
                .PrimaryKey(t => new {t.Provider, t.ProviderUserId});

        CreateTable(
                "dbo.webpages_Roles",
                c => new
                         {
                                 RoleId = c.Int(nullable: false, identity: true),
                                 RoleName = c.String(nullable: false, maxLength: 256)
                         })
                .PrimaryKey(t => t.RoleId);
        CreateTable(
                "dbo.webpages_UsersInRoles",
                c => new
                         {
                                 UserId = c.Int(nullable: false),
                                 RoleId = c.Int(nullable: false)
                         })
                .PrimaryKey(t => new {t.UserId, t.RoleId})
                .ForeignKey("dbo.webpages_Roles", t => t.RoleId);
    }

    public override void Down()
    {
        DropForeignKey("dbo.webpages_UsersInRoles", "RoleId", "dbo.webpages_Roles");
        DropForeignKey("dbo.webpages_UsersInRoles", "UserId", "dbo.webpages_Membership");
        DropTable("dbo.webpages_UsersInRoles");
        DropTable("dbo.webpages_Roles");
        DropTable("dbo.webpages_OAuthMembership");
        DropTable("dbo.webpages_Membership");
    }
}
于 2013-08-10T01:18:23.527 に答える