我应该使用EF代码播种SimpleMembership数据库还是在过滤器内进行?

时间:2013-01-05 14:56:28

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 simplemembership

我刚刚开始实现ASP.NET MVC4 Simple Membership。在模板应用程序中 我看到以下代码:

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"});
        }
    }
}

模板是否在过滤器和其他模板中创建数据库是有原因的 示例有一些迁移文件。人们最常使用的是什么?在我看来 这样做的过滤方式对于启动应用程序来说可以很快地运行 但对其他类型的应用程序来说并不是那么好。

1 个答案:

答案 0 :(得分:0)

我认为在一天结束时,它归结为你想做的事情。

  1. 是否要将应用程序+数据库(带有架构)作为单独的实体进行分发。对于此选项,您需要用户在服务器上装载带有架构的空数据库,并将连接字符串提供给应用程序或

  2. 您是否要分发应用程序并让它在初始安装/配置过程中创建数据库模式(例如wordpress如何执行)。对于此选项,您只需要连接到数据库服务器。实体框架将帮助您生成所需的数据库架构。 另请注意,此代码不必放在过滤器中。如果您阅读此MSDN documentation,您将意识到在操作方法运行之前始终会调用操作过滤器。他们这样做是为了确保在您访问帐户控制器操作之前设置成员资格。