我有一個基於Internet模板的ASP.NET MVC 4網站。我正在使用我使用該模板設置的SimpleMembership。如何使用SimpleMembership管理配置文件?
我可以修改已爲我創建的Users表,但我不確定是否修改已添加的額外字段的「正確」方式。我想要全名,電子郵件等,並將它們添加到用戶表中,但似乎無法通過SimpleMembership WebSecurity。*靜態方法進行更新。
你是否應該在SimpleMembership API之外使用EF自己更新這些屬性?
我有一個基於Internet模板的ASP.NET MVC 4網站。我正在使用我使用該模板設置的SimpleMembership。如何使用SimpleMembership管理配置文件?
我可以修改已爲我創建的Users表,但我不確定是否修改已添加的額外字段的「正確」方式。我想要全名,電子郵件等,並將它們添加到用戶表中,但似乎無法通過SimpleMembership WebSecurity。*靜態方法進行更新。
你是否應該在SimpleMembership API之外使用EF自己更新這些屬性?
如果你看對周圍的accountcontroller
的273線,你會發現這條線
db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
看起來甚至開箱即用它們(MS)如你所說正在這樣做,並使用EF進行更新。
我也在尋找更新和訪問這些屬性的「正確」方式。
編輯:
這裏是我的解決方案(我很高興,如果有人說,有一個開箱即用的方式做到這一點)。
wrap 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模型,用戶配置文件在作爲MVC 4 Internet模板一部分生成的文件AccountModels.cs中定義。只需修改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上找到更多詳細信息。
1 - 你需要啓用遷移,prefereably用的EntityFramework 5
2 - 將您
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true);
在你YourMvcApp /遷移/ 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來僅註冊SimpleMembershi pProvider與已創建的UserProfile表一起使用,還提供了SimpleMembershipProvider的哪個列是UserId和UserName。我還展示了一個例子,說明如何添加用戶,角色並將您的Seed方法中的兩者與自定義UserProfile屬性/字段關聯起來。用戶的手機(號碼)和IsSmsVerified。
3 - 現在當你從包管理器控制檯運行更新的數據庫,EF5將提供與您的所有自定義屬性
有關其他參考資料,請參閱這篇文章源代碼的表: http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/
不錯......這真的幫助我解決了一個非常困難的情況。 :)更多關於這個問題在這裏:http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4- 5-web-forms-and-asp-net-mvc-4-templates.aspx –
這假設你使用Internet模板中的DEMOWARE代碼。在真實世界的應用程序中,您將在數據訪問項目中擁有EF依賴關係,並且您可能不希望依賴於WebMatrix程序集或任何System.Web。 –
我同意,但是如何避免在數據訪問項目中使用Webmatrix? – nportelli
您需要將它們添加到您的數據庫(根據說明完成)
將它們添加到視圖(編輯,添加,刪除和查看),除非修改
將它們添加到您的模型用戶配置文件
然後它會工作。
嗯......我在這裏感覺到一些嚴重的代碼味道......你在用網頁代碼混合DB訪問代碼。我強烈建議將所有實體框架引用重構爲獨立的數據訪問項目,然後使用存儲庫模式允許調用者檢索應用程序的數據。 –
有了這種模式,您如何確保將配置文件的更改寫回數據庫? –
我會將會話中的內容轉換爲UserProfile,而不是使用'as'關鍵字。如果你不小心把其他類型放在那裏,你的getter就會返回* null *。與嘗試和診斷由空UserProfile引起的下游問題相比,立即失敗會更好。 –