2010-03-27 34 views
5

我正在使用ASP.NET SQL成員資格提供程序。所以,有一個aspnet_Users表,其中包含我的每個用戶的詳細信息。 (實際上,aspnet_Membership表似乎包含大部分的實際數據)。使用ASP.NET SQL成員資格提供程序,如何存儲我自己的每用戶數據?

我現在想存儲一些每個用戶的信息在我的數據庫,所以我想我只是創建一個新表與UserId(GUID)列和aspnet_Users的FK關係。但是,我發現我無法輕鬆訪問UserId,因爲它沒有通過會員API公開。 (我知道我可以通過ProviderUserKey訪問它,但它似乎是API將內部UserID抽象爲UserName,我不想對穀物進行太多的改動)。

所以,我想我應該把LoweredUserName列放在我的表格中,然後使用它創建一個FK關係到aspnet_Users。 Bzzzt。錯誤再次,因爲雖然aspnet_Users包括LoweredUserName,它還包括ApplicationId - 所以爲了創建我的FK關係,我需要在我的表中也有一個ApplicationId列。

起初我想:很好,我只處理一個應用程序,所以我只是添加這樣一個列,並給它一個默認值。然後我意識到ApplicationId是一個GUID,所以這樣做會很痛苦。不是確切的,但直到我推出我的數據庫我無法預測GUID將是什麼。

我覺得自己錯過了某些東西,或者以錯誤的方式處理事情。我在做什麼應該

回答

9

我想你正在尋找ProfileProvider,讓你把任何你想要的信息與用戶聯繫起來。

ASP.NET Profile Properties Overview

加成如果內置ProfileProvider不會滿足您的需求,那麼你可以考慮通過編寫從System.Web.Profile.ProfileProvider派生的類實現自己的ProfileProvider。這將使您能夠編寫一些內容,避免您在評論中提到的序列化問題。

Implementing a Profile Provider

加成注意有關SqlMembershipProvider的。即使模式在UserId上鍵入,成員資格類實際上仍以用戶名爲關鍵字,這確實是正確的。坦率地說,這是我對SqlMembershipProvider類的寵愛之一。這實際上在您希望單個用戶存儲但獨立應用程序角色列表的多應用程序環境中會產生問題。

我的建議是鍵入UserId,因爲正如你所提到的那樣,它是aspnet_Users表的主鍵,並用於所有外鍵關係中,並且它是單個值。如果您在LowerUsername(和ApplicationId)上鍵入,並且用戶名更改,則需要啓用級聯更新,以便更改漣漪到您的定製表。

+0

還有你+1。提示碼塊受到關注。 ;-) – 2010-03-27 18:29:21

+1

謝謝,但我不認爲我需要存儲的數據將以序列化格式保持良好。我需要與我的數據庫中已有的各種其他表進行連接。我更喜歡在我可以有效地運行查詢的表中使用我的用戶數據。所以雖然我可以看到Profile存儲的用途,但並不適合我的情況。無論如何。 – 2010-03-27 21:22:29

5

爲此,您可以實施配置文件提供程序。它不是很困難。您將基本設置您的用戶特定設置,如下所示:

(web。配置):

<profile enabled="true" defaultProvider="MyProvider"> 
    <providers> 
     <add name="MyProvider" connectionStringName="MembershipCnnStr" applicationName="MyApp" type="System.Web.Profile.SqlProfileProvider"/> 
    </providers> 
    <properties> 
     <add name="EmployeeId" type="String" /> 
     <group name="UserSettings"> 
      <add name="IsSandboxMode" type="Boolean" defaultValue="false" /> 
      <add name="Shortcuts" type="System.Collections.Generic.List`1[System.string]" /> 
     </group> 
    </properties> 
</profile> 
+0

你再次! +1 ;-) – 2010-03-27 18:28:46

+1

請參閱我對Thomas的回答的評論 - 我不想使用Profile存儲,我想使用真實的數據庫表。無論如何,謝謝+1和細節。 – 2010-03-27 21:23:19

+0

在這種情況下,就像Thomas所說的那樣,您應該編寫自己的自定義提供程序來使用您的數據庫。 – 2010-03-28 22:23:55

3

如果您正在尋找在添加簡單的數據綁定到您的用戶,如添加配置文件屬性,你應該看看Personalization

例如,如果您想將某個人的母親婚前姓名作爲其個人資料信息的一部分進行存儲,則可以使用此功能執行此操作。

它可能不是複雜數據的正確選擇,但它是一個開始。

+0

你們都在同一時間以有效的迴應+1回答。 – 2010-03-27 18:30:15

+0

我應該從一開始就說過,我確實有一大堆現有的數據庫表,並且我需要能夠將我的(複雜)用戶數據存儲在可以加入的表中。所以,配置文件並不適合。爲你的(適當)警告+1。 – 2010-03-27 21:24:47

1

寫.cs文件像

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     FirstNameTextBox.Text = Server.HtmlDecode(Profile.FirstName); 
     LastNameTextBox.Text = Server.HtmlDecode(Profile.LastName); 

    } 

} 

和web.config中

<profile> 
    <providers> 
     <add name="FirstName" type="System.String"/> 
     <add name="LastName" type="System.String"/> 
     <add name="MemberId" defaultValue="0" type="System.Int32"/> 
    <clear/> 
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
    </providers> 
</profile> 
相關問題