my.ASPItalia.com
ASP.NET
|
HTML5
|
LINQ e Entity Framework
|
Silverlight
|
Windows Phone
|
.NET Framework
|
Windows 8
|
Libro WP7
|
Libro HTML5
|
Corso HTML5
Iscriviti
Login
Newsletter
Home
Articoli
Script
Notizie
FORUM
Blogs
Media
Tutorials
Corsi
Libri
Eventi
Tags
Tutti i forum
Ricerca
FAQ
Fai una domanda
Associare record a user
in
.NET Framework
>
ASP.NET 4.0
Ultimo messaggio
michele_p
il 4 settembre 2010 alle 09:40
20 messaggi
dal 25 aprile 2009
Giorno,
Premessa
Piu che un problema pratico (è possibile implementare diverse soluzioni) è un problema di design poichè le soluzioni che mi vengono in mente non mi sembrano soddisfacenti. Dato che si tratta di uno scenario piu che comune, credo esista una sorta di pattern da seguire.
Problema
Mettiamo di avere un semplicissimo datastore (su sql server):
CLIENTI->FATTURE
e che voglia associare ad ogni user memorizzato anch'egli nello stesso DB con nelle tabelle messe a disposizione dall'SQLMembershipProvider, uno ed un solo cliente.
Lo scenario che vorrei ottenere in buona sostanza è che al login ogni user (che è anche un cliente) abbia accesso solamente ai suoi dati e che l'amministratore abbia accesso a tutte le informazioni ma che soprattutto sia in grado di associare gli users ai clienti.
Deve esserci quindi una sorta di collegamento tra gli users (tabella aspnet_mebership) e la tabella clienti.
Possibili soluzioni.
1: LA prima che mi è venuta in mente è stata proprio quella utilizzare come ID della tabella clienti il campo UserId di tipo UniqueIdentifier cosi da creare un collegamento uno a uno tra Clienti e Utenti. La cosa mi serve a poco visto che agli users accedo tramite le classi di asp.net (Membership) mentre ai clienti accedo tramite classi che utilizzano entityframework e nel .edmx non mi sembra nemmeno il caso di importare le tabelle del membership provider. L'altra cosa che non mi piace è che per la tabella Clienti sarei costretto ad utilizzare una strategia di ID diversa da tutte le altre tabelle le quali usano un campo identity autoincrementante.
2: Eliminare la tabella clienti, mettere tutte le informazioni nel profile e collegare la tabella fatture (e tutto il resto) direttamente alla aspnet_membership ma anche qui sarei costretto ad utilizzare quest'ultima in EF e soprattutto avrei un DB fortemente dipendente dal fatto di utilizzare asp.net e uno specifico membership provider.Peraltro non saprei nemmeno se la cosa sia fattibile.
3: La soluzione piu semplice ma anche la piu sporca di tutte, è quella di utilizzare un ulteriore campo USerId(guid)o anche username a questo punto, nella tabella clienti che indichi se e quale utente sia collegato a quel cliente ma anche in questo caso si presentano vari problemi come l'integrità referenziale (Non c'è nessun collegamento tra le tabelle e anche se ci fosse non avrebbe molto senso).
Cercando su internet ho visto che molti hanno questo problema e cercano soluzioni del tipo visto su, ma sembra che in queste soluzioni sia nascosto un problema di design in quanto chi risponde premette sempre una sorta di "non vedo a cosa possa servire ma si fa cosi...".
Esiste un modo pulito per associare gli users ai clienti senza "legare" tra loro le tabelle della membership provider e il resto del database (le cui logiche fino a buona parte dello strato di business non dovrebbero di fatto nemmeno sapere che l'applicazione gira su aspnet e tamtomeno il tipo di membership provider utilizzato)?
Michele.
Rispondi
Quoting
fabrica
il 4 settembre 2010 alle 11:55
1.732 messaggi
dal 03 dicembre 2001
www.fabricasoft.net
Ciao, non comprendo le tue perplessità, sopratutto per quanto riguarda il punto 3.
Ho affrontato piu volte il problema creando semplicemente la tabella Clienti con FK MembershipKey (Guid) avente relazione 1 - 1 con la aspnet_Membership, la cui PK è UserId (Guid).
In questo caso rispetti perfettamente l'integrità referenziale.
Anche nel caso dovessi fornire piu credenziali d'accesso ad un singolo cliente la logica non cambierebbe di molto e avresti sempre il db normalizzato.
Fabrizio Canevali
Rispondi
Quoting
fabrica
il 4 settembre 2010 alle 12:03
1.732 messaggi
dal 03 dicembre 2001
www.fabricasoft.net
Precisazione, nel punto 3, ovviamente, non ha senso replicare lo UserName nella tabella Clienti perchè già contenuto nella tabella aspnet_Users.
Fabrizio Canevali
Rispondi
Quoting
mizrael
il 4 settembre 2010 alle 14:36
356 messaggi
dal 14 ottobre 2008
Contributi
davideguida.netne.net
IMHO, concordo pienamente con fabrica: la tabella clienti va vista come una specie di "estensione" di quella utenti, quindi non è errato inserire una FK alla PK di Users...
Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net
Rispondi
Quoting
fabrica
il 4 settembre 2010 alle 16:01
1.732 messaggi
dal 03 dicembre 2001
www.fabricasoft.net
Imvho, concordo pure io con fabrica
Fabrizio Canevali
Rispondi
Quoting
michele_p
il 4 settembre 2010 alle 18:24
20 messaggi
dal 25 aprile 2009
Grazie per la celere risposta ;)
Sicuramente è corretto come hai suggerito, ora ho provato ad immaginare come potrei implementare alcune funzionalità in modo pulito (Recuperare un utente dato un cliente e viceversa, recuperare tutti i clienti a cui non è stato associato un utente e viceversa) penso che dovrei costruire una classe ad hoc a livello di business. ci lavorerò su l'importante è aver capito la maniera corretta con cui affrontare questa situazione.
thx
Rispondi
Quoting
fabrica
il 4 settembre 2010 alle 19:37
1.732 messaggi
dal 03 dicembre 2001
www.fabricasoft.net
michele_p ha scritto:
thx
Di nulla.
Considera che la struttura, in questo modo, è davvero semplice, con un paio di metodi risolvi tutto.
Fabrizio Canevali
Rispondi
Quoting
Salto rapido
Ultimi messaggi
Tutti i forum
Ricerca
Utenti online
ASP.NET
ASP.NET 2.0
ASP.NET 3.5
ASP.NET 4.0
.NET Framework
Silverlight
Windows Phone
Windows Presentation Foundation e WinForms
Windows Communication e Workflow
ASP - avanzato
ASP - base
SQL Server e MySQL
E-commerce
Hosting
Altri linguaggi e tecnologie
Windows Server, IIS & Security
Libri
OT
Commenti: blogs e notizie
Eventi
Torna al forum
| Feed
RSS
ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Effettua il login!
Hai dimenticato la password?
Ultimi messaggi
il repeater non rinomina il CLientID per gli ajaxRating
(1)
web.config su più virtual folder
(2)
problema DropDownList e IE7/IE8
PreviousPage and url routing asp.net 4.0
Un Rating Custom Control con DropDownList e jQuery
percorso script mvc
Condizionare un controllo nell'ItemTemplate di un Repeater in base all'Entity
(2)
UTENTI ONLINE
In primo piano
Annunciate le versioni ufficiali di Visual Studio 11
Rilasciato Visual Studio 11 Beta: scopri tutte le novità!
Windows 8 Consumer Preview: segui con noi la diretta
I più letti di oggi
Sviluppare applicazioni web mobile con HTML5 e jQuery mobile
Le novità di ASP.NET 4.5 (Community Days 2012)
Metro Style App per Windows 8 con HTML e Javascript
Introduzione ad Entity Framework
Web Camp - ASP.NET MVC 3 (Community Days 2012)
Introduzione a LINQ, LINQ to XML, Object e DataSet
Migliorare le prestazioni di Entity Framework limitando l'uso del metodo Include
Windows Phone 7.5 Developer Day: costruire un'app in 60 minuti
Applicazioni Metro con XAML: cosa cambia per lo sviluppatore .NET con Windows 8
Windows 8: introduzione allo sviluppo
Media
Sviluppare applicazioni web mobile con HTML5 e jQuery mobile
Metro Style App per Windows 8 con HTML e Javascript
Tutti i media
In evidenza
Dal 29 febbraio arriva WinRTItalia.com: tutto sullo sviluppo per Windows 8 e Metro
Migliorare le prestazioni di Entity Framework limitando l'uso del metodo Include
Aprire una popup in Silverlight
Sviluppare applicazioni web mobile con HTML5 e jQuery mobile
Disegnare un'applicazione a servizi con Entity Framework e WCF
Il nuovo tag time in HTML5
Salvare e leggere rapidamente le impostazioni di un'applicazione Windows Phone
Metro Style App per Windows 8 con HTML e Javascript
MISC
I nostri autori
Collabora con noi!
Media Kit - Pubblicità sul nostro network