Asp.net mvc 4 如何使用SimpleMembership管理配置文件?

Asp.net mvc 4 如何使用SimpleMembership管理配置文件?,asp.net-mvc-4,simplemembership,Asp.net Mvc 4,Simplemembership,我有一个基于internet模板的ASP.NETMVC4站点。我使用的是使用该模板设置的SimpleMembership 我可以修改为我创建的用户表,但我不确定如何“正确”修改我添加的额外字段。我想要全名、电子邮件等,并已将它们添加到用户表中,但似乎无法通过SimpleMembership WebSecurity.*静态方法进行更新 您是否应该在SimpleMembership API之外使用EF自己更新这些属性?如果您查看accountcontroller的第273行,您会发现这一行 db.U

我有一个基于internet模板的ASP.NETMVC4站点。我使用的是使用该模板设置的SimpleMembership

我可以修改为我创建的用户表,但我不确定如何“正确”修改我添加的额外字段。我想要全名、电子邮件等,并已将它们添加到用户表中,但似乎无法通过SimpleMembership WebSecurity.*静态方法进行更新


您是否应该在SimpleMembership API之外使用EF自己更新这些属性?

如果您查看
accountcontroller
的第273行,您会发现这一行

db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
看起来,即使是OOTB,他们(MS)也在按照您的建议进行操作,并使用EF进行更新

我也在寻找更新和访问这些属性的“正确”方法

编辑:

这是我的解决方案(如果有人说有一种OOTB方法可以做到这一点,我很高兴)

UserProfile
(SimpleMembership中的.net实体)包装到会话类中

public static class sessionHelpers {
     public static UserProfile userProfile
        {
            get
            {
                if (HttpContext.Current.Session["userProfile"] != null)
                {
                    return HttpContext.Current.Session["userProfile"] as UserProfile; 
                }
                else
                {
                    using (UsersContext db = new UsersContext())
                    {
                        HttpContext.Current.Session["userInfo"] =
                        db.UserProfiles.Where(x => x.UserName == 
                            HttpContext.Current.User.Identity.Name).FirstOrDefault();

                   return db.UserProfiles.Where(x => x.UserName == 
                       HttpContext.Current.User.Identity.Name).FirstOrDefault();
                    }
                }
            }
            set { HttpContext.Current.Session["userProfile"] = value; }
        }
}
通过此操作,您可以访问配置文件表

string foo = sessionHelpers.userProfile.FIELDNAME;

其中,
sessionHelpers
是我的包装器类。if块只是确保如果当前会话中没有设置它,那么访问它将尝试获取它。

他们使使用SimpleMembership修改概要文件变得很容易。SimpleMembership使用代码优先EF模型,用户配置文件在AccountModels.cs文件中定义,该文件是作为MVC 4的Internet模板的一部分生成的。只需修改类UserProfile并在类定义中添加新字段。例如,为电子邮件添加一个字段将如下所示:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
}
以下是有关如何访问电子邮件字段的示例:

var context = new UsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
var email = user.Email;
下面是添加电子邮件字段后数据库的外观


有一个很好的博客,描述了其中的一些问题。您还可以在上找到更多详细信息。

1-您需要启用迁移,尤其是使用EntityFramework 5

2-移动你的

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 
到您的MVCAPP/Migrations/Configuration.cs类中的种子方法

    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", IsSmsVerified = false});

        if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
            Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
    }
现在EF5将负责创建您的UserProfile表,完成此操作后,您将调用WebSecurity.InitializeDatabaseConnection以仅向已创建的UserProfile表注册SimpleMembershipProvider,并告诉SimpleMembershipProvider哪列是用户ID和用户名。我还展示了一个示例,说明如何在种子方法中添加用户、角色,并将这两个角色与自定义用户配置文件属性/字段相关联,例如用户的手机(号码)和ISSMVerified

3-现在,当您从PackageManager控制台运行update database时,EF5将为您的表提供所有自定义属性

有关其他参考资料,请参阅本文的源代码:

您需要将它们添加到数据库中(根据说明完成)

将它们添加到视图(编辑、添加、删除和查看),除非进行了修改

将它们添加到UserProfiles中的模型中


然后它就会起作用。

不过还有两个问题。1) 在此处添加属性是否会自动更改数据库?如何从API获取当前登录用户的电子邮件?(假设上面的属性)它将在创建时更改DB模式,因此您需要删除任何现有的DB才能工作。我更新了答案以显示您可以访问电子邮件。它不像旧的MembershipProvider那样是一个API。现在我更新了UserProfile类并删除了我的数据库表,但在重新创建时,新字段没有出现?同样,当我反编译WebSecurity.InitializeDatabaseConnection时,我可以看到它只显示UserName和UserId。其中没有代码可以执行额外的列。我想你必须自己创建它们。它会自动为我创建数据库中的新列,只需修改UserProfile类,正如你在我更新的答案中看到的那样。您使用的是什么版本的MVC4和VS?这是使用最新版本的MVC4(不是beta版或RC版)完成的,它运行在最新版本的VS2012上。。。这确实帮助我解决了一个非常困难的局面关于这个问题的更多信息:假设您使用的是来自Internet模板的DEMOWARE代码。在现实世界的应用程序中,您在数据访问项目中会有EF依赖项,您可能不希望依赖WebMatrix程序集或任何System.Web。我同意,但您如何在数据访问项目中使用WebMatrix?我有一个问题,我做了一切,成功地创建了角色和用户,但当我试图影响用户扮演角色时,我遇到了异常,因为users表是空的,我的users数据进入UserTable,所以到底出了什么问题嗯…我在这里感觉到一些严重的代码气味…您将DB访问代码与web代码混合在一起。我强烈建议将所有实体框架引用重构为一个独立的数据访问项目,然后使用repository模式允许调用方检索应用程序的数据,如何确保将对概要文件的更改写回数据库?我会将会话中的内容转换为UserProfile,而不是将
用作
关键字。如果您不小心在其中放入了其他类型,那么getter将返回null。与其尝试诊断由空UserProfile引起的下游问题,不如立即失败。代码使用相同的查询查询数据库两次。虽然查询可能是缓存的,但它仍然是额外的负载。