19

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

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

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

4

4 回答 4

22

1 - 您需要启用迁移,最好使用 EntityFramework 5

2 - 移动你的

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

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

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

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

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

于 2012-09-28T17:45:15.307 回答
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; }
}

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

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

这是添加电子邮件字段后数据库的样子。

在此处输入图像描述

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

于 2012-09-10T14:39:38.427 回答
4

如果你看一下第 273 行,accountcontroller你会发现这条线

db.UserProfiles.Add(new UserProfile { UserName = model.UserName });

看起来他们(MS)正在按照您的建议进行 OOTB 并使用 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; }
        }
}

从这里您可以通过执行访问配置文件表

string foo = sessionHelpers.userProfile.FIELDNAME;

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

于 2012-09-10T13:21:03.727 回答
1

您需要将它们添加到您的数据库中(根据描述完成)

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

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

然后它将起作用。

于 2013-07-19T20:15:31.387 回答