如何使用SimpleMembership管理配置文件?

Pla*_*son 19 asp.net-mvc-4 simplemembership

我有一个基于互联网模板的ASP.NET MVC 4站点.我正在使用我使用该模板设置的SimpleMembership.

我可以修改已经为我创建的Users表,但我不确定修改我添加的额外字段的"正确"方法.我想要Fullname,Email等,并将它们添加到用户表中,但似乎无法通过SimpleMembership WebSecurity.*静态方法进行更新.

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

LeL*_*g37 22

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

2 - 移动你的

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 
Run Code Online (Sandbox Code Playgroud)

您的YourMvcApp/Migrations/Configuration.cs类中的Seed方法

    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"});
    }
Run Code Online (Sandbox Code Playgroud)

现在EF5将负责创建您的UserProfile表,在这样做之后,您将调用WebSecurity.InitializeDatabaseConnection仅使用已创建的UserProfile表注册SimpleMembershipProvider,同时调用SimpleMembershipProvider哪个列是UserId和UserName.我还展示了如何添加用户,角色并将Seed方法中的两者与自定义UserProfile属性/字段相关联的示例,例如用户的Mobile(数字)和IsSmsVerified.

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

有关其他参考资料,请参阅本文的源代码:http: //blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom -user的属性/

  • 这假设您使用的是Internet模板中的DEMOWARE代码.在真实世界的应用程序中,您在数据访问项目中拥有EF依赖项,并且您可能不希望它依赖于WebMatrix程序集或任何System.Web. (6认同)

Kev*_*ans 15

他们使用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; }
}
Run Code Online (Sandbox Code Playgroud)

以下是有关如何访问电子邮件字段的示例:

var context = new UsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
var email = user.Email;
Run Code Online (Sandbox Code Playgroud)

以下是添加电子邮件字段后数据库的外观.

在此输入图像描述

有一个很好的博客描述了SimpleMembership中的一些变化.您还可以在此处找到有关自定义和播种SimpleMembership的更多详细信息.


Eon*_*dan 4

如果你仔细查看第 273 行,accountcontroller你会发现这一行

db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
Run Code Online (Sandbox Code Playgroud)

看起来甚至 OOTB 他们(MS)正在按照您的建议进行操作并使用 EF 进行更新。

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

编辑:

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

UserProfile将(来自 的 .net 实体)包装SimpleMembership在会话类中。

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; }
        }
}
Run Code Online (Sandbox Code Playgroud)

从此您可以通过执行以下操作来访问配置文件表

string foo = sessionHelpers.userProfile.FIELDNAME;
Run Code Online (Sandbox Code Playgroud)

sessionHelpers我的包装类在哪里。if 块只是确保如果当前会话中尚未设置它,则访问它时将尝试获取它。

  • 嗯...我在这里感觉到一些严重的代码味道...您正在将数据库访问代码与 Web 代码混合在一起。我强烈建议将所有实体框架引用重构为一个独立的数据访问项目,然后使用存储库模式允许调用者检索应用程序的数据。 (2认同)