2010-03-27 15 views
5

Sto utilizzando il provider di appartenenze SQL ASP.NET. Quindi, c'è una tabella aspnet_Users che contiene i dettagli di ciascuno dei miei utenti. (In realtà, la tabella aspnet_Membership sembra contenere la maggior parte dei dati effettivi).Utilizzando il provider di appartenenze SQL di ASP.NET, come posso archiviare i miei dati per utente?

Ora desidero memorizzare alcune informazioni per utente nel mio database, quindi ho pensato di creare una nuova tabella con una colonna UserId (GUID) e una relazione FK su aspnet_Users. Tuttavia, ho scoperto che non posso accedere facilmente allo UserId poiché non è esposto tramite l'API di appartenenza. (So ​​che posso accedervi tramite lo ProviderUserKey, ma sembra che l'API stia estraendo il numero interno UserID in favore dello UserName e non voglio andare troppo lontano contro la grana).

Quindi, ho pensato che dovrei invece inserire una colonna LoweredUserName nella mia tabella e creare una relazione FK a aspnet_Users usando quello. Bzzzt. Sbagliato ancora, perché mentre c'è un indice univoco in che include il LoweredUserName, include anche lo ApplicationId - così, per creare la mia relazione FK, avrei bisogno di avere anche una colonna ApplicationId nella mia tabella.

All'inizio ho pensato: bene, mi occupo solo di una singola applicazione, quindi aggiungerò semplicemente una colonna e assegnerò un valore predefinito. Poi ho capito che il ApplicationId è un GUID, quindi sarebbe un problema farlo. Non rigido esattamente, ma fino a quando non lancio il mio DB non posso prevedere quale sarà il GUID.

Mi sento come se mi mancasse qualcosa, o facessi le cose nel modo sbagliato. Cosa devo fare ?

risposta

9

Penso che tu stia cercando ProfileProvider che ti permetta di associare qualsiasi informazione arbitraria che desideri all'utente.

ASP.NET Profile Properties Overview

OLTRE Se il built-in ProfileProvider non soddisfa le tue esigenze, allora si potrebbe considerare di implementare la propria ProfileProvider scrivendo una classe che deriva da System.Web.Profile.ProfileProvider. Ciò ti consentirebbe di scrivere qualcosa che eviti i problemi di serializzazione che hai citato nel tuo commento.

Implementing a Profile Provider

OLTRE Nota circa la SqlMembershipProvider. In effetti, sei corretto sul fatto che le classi di appartenenza siano realmente basate sul nome utente anche se lo schema è impostato su UserId. Questo è francamente uno dei miei dubbi sulle classi SqlMembershipProvider. Questo crea effettivamente un problema in un ambiente multi-applicazione in cui si desidera un singolo archivio utente ma elenchi di ruoli di applicazioni indipendenti.

La mia raccomandazione sarebbe quella di digitare UserId poiché è, come già menzionato, la chiave primaria della tabella aspnet_Users e viene utilizzata in tutte le relazioni con le chiavi esterne ed è un valore singolo. Se si digita LowerUsername (e ApplicationId) e il nome utente cambia, sarà necessario disporre dell'aggiornamento a cascata abilitato in modo che la modifica si rifletta sulle tabelle personalizzate.

+0

E anche te +1. i blocchi di tip-code attirano l'attenzione. ;-) –

+1

Grazie, ma non penso che i dati che ho bisogno di archiviare si trovino bene in un formato serializzato. Dovrò fare join con vari altri tavoli che ho già nel mio database. Preferirei avere i miei dati utente nelle tabelle su cui posso eseguire in modo efficiente le query. Quindi, mentre posso vedere un utilizzo per l'archiviazione del profilo, non è adatto alla mia situazione. +1 comunque. –

5

Per fare ciò, è possibile implementare un provider di profili. Non è molto difficile. Fonderai fondamentalmente le tue impostazioni specifiche dell'utente in questo modo:

(web.config):

<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

ANCORA TU! +1 ;-) –

+1

Si prega di vedere il mio commento sulla risposta di Thomas - Non voglio usare la memoria del profilo, voglio usare una tabella reale del database. Grazie comunque e +1 per i dettagli. –

+0

In tal caso, proprio come ha detto Thomas, dovresti scrivere il tuo provider personalizzato che utilizza il tuo database. –

3

Se stai guardando l'aggiunta di dati semplici legati agli utenti, ad esempio le proprietà Profilo aggiunto, si dovrebbe guardare in Personalization.

Esempio, se si desidera memorizzare il nome da nubile di una madre di una persona come parte delle informazioni del proprio profilo, è possibile farlo utilizzando questa funzione.

Probabilmente non è la scelta giusta per dati complessi, ma è un inizio. il file

+0

Hai risposto tutti allo stesso tempo con una risposta valida, quindi +1. –

+0

Avrei dovuto dire all'inizio che ho un sacco di tabelle di database esistenti, e ho bisogno di essere in grado di memorizzare i miei dati utente (complessi) in una tabella con cui posso unirmi. Quindi, i profili non saranno davvero adatti. +1 per il tuo avvertimento (appropriato). –

1

cs scrivere come

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

    } 

} 

e 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> 
Problemi correlati