我有一个基于互联网模板的ASP.NET MVC 4站点。我正在使用我使用该模板设置的SimpleMembership。
我可以修改已经为我创建的Users表,但我不确定修改我添加的额外字段的“正确”方法。我想要Fullname,Email等,并将它们添加到用户表中,但似乎无法通过SimpleMembership WebSecurity。*静态方法进行更新。
您是否应该在SimpleMembership API之外使用EF自己更新这些属性?
答案 0 :(得分: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仅使用已创建的UserProfile表注册SimpleMembershipProvider,同时调用SimpleMembershipProvider哪个列是UserId和UserName。我还展示了如何添加用户,角色并将Seed方法中的两者与自定义UserProfile属性/字段相关联的示例,例如用户的移动(号码)和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-properties/ 强>
答案 1 :(得分: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;
以下是添加电子邮件字段后数据库的外观。
有一个很好的博客描述了一些changes in SimpleMembership here。您还可以在customizing and seeding SimpleMembership here找到更详细的信息。
答案 2 :(得分:4)
如果你向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块只确保如果尚未在当前会话中设置,则访问它将尝试获取它。
答案 3 :(得分:1)
您需要将它们添加到数据库中(根据说明完成)
将它们添加到视图(编辑,添加,删除和查看),除非修改
在UserProfiles
中将它们添加到您的模型中然后它会起作用。