我有一个基于互联网模板的ASP.NET MVC 4站点。我使用了SimpleMembership,这是我在该模板上设置的。
我可以修改为我创建的Users表,但我不确定修改我添加的额外字段的“正确”方式。我想要Fullname、Email等信息,并将它们添加到用户表中,但似乎没有通过SimpleMembership WebSecurity.*静态方法进行更新的方法。
你应该只是在SimpleMembership API之外使用EF自己更新这些属性吗?
我有一个基于互联网模板的ASP.NET MVC 4站点。我使用了SimpleMembership,这是我在该模板上设置的。
我可以修改为我创建的Users表,但我不确定修改我添加的额外字段的“正确”方式。我想要Fullname、Email等信息,并将它们添加到用户表中,但似乎没有通过SimpleMembership WebSecurity.*静态方法进行更新的方法。
你应该只是在SimpleMembership API之外使用EF自己更新这些属性吗?
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仅向已创建的UserProfile表注册SimpleMembershipProvider,还告诉SimpleMembershipProvider哪个列是UserId和UserName。我还展示了一个示例,演示如何在Seed方法中添加用户、角色以及关联两者与自定义UserProfile属性/字段(例如用户的Mobile(号码)和IsSmsVerified)。他们通过SimpleMembership使得修改个人资料变得简单。 SimpleMembership使用的是Code First 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 的更详细信息。
accountcontroller
的第273行附近查看,你会找到这一行。db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
看起来,即使是OOTB,微软也正在按照您建议的方式使用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 块仅确保如果在当前会话中未设置它时访问它将尝试获取它。
as
关键字。如果您意外地放入其他类型,您的getter将只返回* null *。最好立即失败,而不是尝试诊断由空UserProfile引起的下游问题。 - Eric J.你需要将它们添加到数据库中(按照说明完成)
将它们添加到视图中(编辑、添加、删除和查看),除非修改过
将它们添加到你的用户资料模型中
然后它就会起作用。