0

ASP.NET MVC4SimpleMembershipの実装を始めたばかりです。テンプレートアプリケーションでは、次のコードが表示されます。

namespace WebUx.Filters
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
    {
        private static SimpleMembershipInitializer _initializer;
        private static object _initializerLock = new object();
        private static bool _isInitialized;

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Ensure ASP.NET Simple Membership is initialized only once per app start
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
        }

        private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                Database.SetInitializer<UsersContext>(null);

                try
                {
                    using (var context = new UsersContext())
                    {
                        if (!context.Database.Exists())
                        {
                            // Create the SimpleMembership database without Entity Framework migration schema
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }

                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

周りを見回すと、次のような他の例が表示されます。

#region

using System.Data.Entity.Migrations;
using System.Linq;
using System.Web.Security;
using MVC4SimpleMembershipCodeFirstSeedingEF5.Models;
using WebMatrix.WebData;

#endregion

namespace MVC4SimpleMembershipCodeFirstSeedingEF5.Migrations
{
    internal sealed class Configuration : DbMigrationsConfiguration<UsersContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

        protected override void Seed(UsersContext context)
        {
            WebSecurity.InitializeDatabaseConnection(
                "DefaultConnection",
                "UserProfile",
                "UserId",
                "UserName", autoCreateTables: true);

            if (!Roles.RoleExists("Administrator"))
                Roles.CreateRole("Administrator");

            if (!WebSecurity.UserExists("lelong37"))
                WebSecurity.CreateUserAndAccount(
                    "lelong37",
                    "password",
                    new {Mobile = "+19725000000"});

            if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
                Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
        }
    }
}

テンプレートがフィルターでデータベースの作成を行い、他の例にある種の移行ファイルがある理由はありますか?人々は何を最も頻繁に使用しますか?私には、それを行うフィルターの方法は、スタートアップアプリケーションがそれを迅速に動作させるためには問題ないが、他の種類のアプリケーションにはあまり良くないように思われる。

4

1 に答える 1

0

結局は自分がどうしたいかだと思います。

  1. アプリケーション + データベース (スキーマ付き) を個別のエンティティとして配布しますか。このオプションでは、ユーザーが空のデータベースをスキーマとともにサーバーにマウントし、接続文字列をアプリケーションに提供するか、

  2. アプリケーションを配布し、最初のインストール/構成プロセス中にデータベース スキーマを作成しますか (たとえば、wordpress の方法)。このオプションでは、データベース サーバーへの接続のみが必要です。エンティティ フレームワークは、必要なデータベース スキーマを生成するのに役立ちます。また、このコードをフィルター内に配置する必要がないことにも注意してください。このMSDN ドキュメントを読むと、アクション メソッドが実行される前にアクション フィルターが常に呼び出されることがわかります。これは、アカウント コントローラーのアクションにアクセスする前にメンバーシップが設定されていることを確認するためです。

于 2013-01-05T21:35:43.940 に答える