0

我刚刚开始实施 ASP.NET MVC4 简单成员。在模板应用程序中,我看到以下代码:

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 回答