2012-09-10 21 views
19

我有一個基於Internet模板的ASP.NET MVC 4網站。我正在使用我使用該模板設置的SimpleMembership。如何使用SimpleMembership管理配置文件?

我可以修改已爲我創建的Users表,但我不確定是否修改已添加的額外字段的「正確」方式。我想要全名,電子郵件等,並將它們添加到用戶表中,但似乎無法通過SimpleMembership WebSecurity。*靜態方法進行更新。

你是否應該在SimpleMembership API之外使用EF自己更新這些屬性?

回答

4

如果你看對周圍的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塊只是確保如果它沒有在當前會話中設置,訪問它將試圖獲得它。

+2

嗯......我在這裏感覺到一些嚴重的代碼味道......你在用網頁代碼混合DB訪問代碼。我強烈建議將所有實體框架引用重構爲獨立的數據訪問項目,然後使用存儲庫模式允許調用者檢索應用程序的數據。 –

+0

有了這種模式,您如何確保將配置文件的更改寫回數據庫? –

+0

我會將會話中的內容轉換爲UserProfile,而不是使用'as'關鍵字。如果你不小心把其他類型放在那裏,你的getter就會返回* null *。與嘗試和診斷由空UserProfile引起的下游問題相比,立即失敗會更好。 –

15

他們很容易用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; 

這裏是數據庫的樣子加入後電子郵件字段。

enter image description here

還有就是介紹一些changes in SimpleMembership here的一個很好的博客。您還可以在customizing and seeding SimpleMembership here上找到更多詳細信息。

+0

這兩個問題雖然。 1)在這裏添加屬性是否自動更改數據庫?以及如何從API獲取當前登錄用戶的電子郵件? (假設上面的屬性) – Eonasdan

+0

它將在創建時更改數據庫模式,因此您需要刪除任何現有的數據庫才能使其工作。我更新了答案以表明您將訪問該電子郵件。它不像舊的MembershipProvider那樣是一個API。 –

+0

沒問題,所以這就是我的想法。 – Eonasdan

22

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/

+0

不錯......這真的幫助我解決了一個非常困難的情況。 :)更多關於這個問題在這裏: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 –

+6

這假設你使用Internet模板中的DEMOWARE代碼。在真實世界的應用程序中,您將在數據訪問項目中擁有EF依賴關係,並且您可能不希望依賴於WebMatrix程序集或任何System.Web。 –

+0

我同意,但是如何避免在數據訪問項目中使用Webmatrix? – nportelli

1

您需要將它們添加到您的數據庫(根據說明完成)

將它們添加到視圖(編輯,添加,刪除和查看),除非修改

將它們添加到您的模型用戶配置文件

然後它會工作。