4

SQLExpressDB上にMVC3EFコードファーストアプリケーションを構築しています。スキーマが変更されるたびにデータベースが自動生成されることは、私にとって非常に重要です。現在、アプリケーションに認証を追加しており、MVCに付属している認証フレームワークを調べました。ただし、表示されているように、新しいデータベースが生成されるたびにaspnet_regsql.exeを実行する必要があります。認証テーブルをアプリケーションデータベースと同じデータベースに配置する必要があります。

私は基本的に私のオプションが何であるか疑問に思っています。

  • 認証フレームワークを使用して、Entity Frameworkが他のデータを生成するのと同じ方法で自動生成することは可能ですか?
  • そうでない場合は、独自の認証を作成しても問題ありませんが、使用できる部分はまだありますか?言い換えれば、カスタムメンバーシッププロバイダーなどを作成する必要がありますか?[認証]などの属性を使い続けたいです。

私は正しい方向にいくつかのポインターを使うことができました。

4

2 に答える 2

3

DbMigrationsConfigurationのシードメソッドをオーバーライドするか、移行を作成できます。

これで、aspnet_regsql.exeから生成できるSQLを実行するか、権限があればaspnet_regsql.exeを実行できるようになります。

更新1:

私は次のようにすることになりました:

Add-Migration AspNetRegSql

public partial class AspNetRegSql : DbMigration
{
    public override void Up()
    {
        Migrate(false);
    }

    public override void Down()
    {
        Migrate(true);
    }

    private static void Migrate(bool down)
    {
        var action = down ? "R" : "A";
        var connectionstring = ConfigurationManager.ConnectionStrings["DataContext"];
        var arguments = string.Format(@"-Q -C ""{0}"" -{1} mrp", connectionstring, action);

        var processStartInfo = new ProcessStartInfo
        {
            WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(@"file:\", string.Empty),
            FileName = "aspnet_regsql.exe",
            Arguments = arguments,
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden
        };

        using (var process = Process.Start(processStartInfo))
        {
            process.WaitForExit();
        }
    }
}

次に、プロジェクトに「aspnet_regsql.exe」を追加し、ビルドアクションを「新しい場合はコピー」に変更しました。

更新2:

NSGagaが投稿したライブラリを知りませんでした。まだ見ていませんが、検討することをお勧めします。

更新3:

いくつかの便利なリンク:

于 2012-04-28T10:47:35.097 に答える
3

CodeFirst Membership Provider (最初にコードに基づくカスタムプロバイダー)から始めて、必要に応じてそれを拡張することができます(サイトで推奨される使用法も読んでください) 。

上記は、2つを実際に統合できるIMOの最良の方法です(たとえば、メンバーシップテーブルに直接アクセスする必要がある場合、独自のユーザー/クライアントテーブルに関連する場合など)。

しかし、他のオプションもあります...

a)独自のDb初期化子を作成してデータベースをシードする(ここで提案されているようにhttps://stackoverflow.com/a/5462981/417747。注:aspnetテーブルのSQLスクリプトの実行から、モデルの作成まで、さまざまなアプローチを利用できます。 aspnetテーブルなど)または

b)データベースを「保存」するDb初期化子を使用し、最初にaspnetテーブルを使用してデータベースを準備します

c)(最後になりましたが)移行を使用します(@Chrisによって正しく提案されています)。移行は非常に強力です。Dbを変更する代わりにSQLを生成するために実行することができますUpdate-Database -Script。次に、それを(aspnetスクリプトまたはシードされたdbと)組み合わせて、dbの作成または更新に使用します。移行にはある程度の学習が必要ですが、より複雑なものについては、努力する価値があります。

お役に立てれば

于 2012-04-28T13:16:28.317 に答える