Wie kann die Verwendung der Mitgliedschafts-API mit eigenen anwendungsbezogenen Daten kombiniert werden?

8

Entwerfen einer neuen Anwendung in asp.net 4 Ich muss eine Entscheidung treffen, wie eine MS SQL Membership API zusammen mit meinen eigenen Daten in der MS SQL-Datenbank verwendet wird. Erstens muss ich Benutzerprofildaten flexibler speichern und darauf zugreifen, als der Profilanbieter unterstützt. Zweitens möchte ich andere benutzerbezogene Informationen (z. B. Bestellungen) verknüpfen.

Unabhängig davon, wo Sie Ihre aspnetdb-Tabellen speichern (in der separaten Datenbank oder in der gleichen Datenbank mit Ihren Daten), bleibt das Problem bestehen, wie Sie Ihre Daten synchronisiert halten können.

Nach einer Recherche sehe ich folgende relevante Optionen:
1. Fremdschlüssel UserId von asp_Users (vorgeschlagen in diese Anleitung).
2. Kein Fremdschlüssel - Transaktionen verwenden (empfohlen hier ).
3. Kein Fremdschlüssel - verwenden Sie den angepassten AccountController (was auch immer es ist, vorgeschlagen hier ).
4. Zusätzliche Tabelle, die Membership UserId (uid) mit benutzerdefinierter UserId (int) verbindet.
5. ...

Auf der einen Seite mag ich die erste Lösung, da sie ziemlich einfach ist und in einem offiziellen asp.net Tutorial vorgeschlagen wird.

Andererseits bemerken die Gegner recht vernünftig, dass die Verwendung von Fremdschlüsseln die allgemeine Idee von Anbietern durchbricht, die dazu beitragen sollen, Bedenken zu trennen und austauschbar zu sein. Aber leider gehen sie nicht so sehr in die Einzelheiten der Implementierung ein, so dass es nicht wirklich einfach ist, diese Vorschläge in Bezug auf Relevanz und Einfachheit der Implementierung zu bewerten.

Was ist die beste Option, um das zu erreichen? Wie sieht die Implementierung aus? Wäre es ausreichend, nur zusätzlichen ADO.NET- oder LINQ-Code zu verwenden oder lohnt es sich, einen benutzerdefinierten Mitgliedschafts- und / oder Profilanbieter zu implementieren?

Vielen Dank im Voraus.

    
Kirill 30.06.2011, 09:02
quelle

2 Antworten

7

Der erste ist der einfachste Weg. Fügen Sie die GUID des Benutzers als Fremdschlüssel in den zugehörigen Tabellen hinzu (zB Ordered_by). Ich sehe nicht, wo es Trennung trennt Bedenken. Wenn Sie den Bestelldatensatz in der Datenbank behalten möchten, müssen Sie auch den Benutzer, der bestellt hat, behalten, das macht durchaus Sinn.

Ich habe Option 4 erfolgreich in meiner aktuellen Anwendung verwendet. Ich habe eine Tabelle aspnet_UserID mit idUser int als Primärschlüssel und fUUser (die GUID des aspnet_Users ) als Fremdschlüssel erstellt. Hier ist das Modell:

(Hinweis: User ist die Standard-Tabelle aspnet_Users , die über aspnet_regsql.exe und aspnet_UserId ist meine benutzerdefinierte Tabelle, die jeden Guid mit meiner int-ID abbildet)

Jetzt speichere ich nur mein idUser als FK in allen verwandten Tabellen (wie in Ihrer Order-Tabelle). Das hat den Vorteil von weniger Speicher und besser lesbaren UserIDs (ich könnte mich nie an eine GUID erinnern). Vielleicht ist es mit diesem "Wrapper-Tisch" etwas mehr getrennt, aber das war nicht meine Absicht.

Sie können die Löschregel auf Ihren Fremdschlüsseln ändern, wenn Sie das Verhalten steuern möchten . Setzen Sie es auf Cascade , wenn Sie z. Möchten Sie alle Bestellungen löschen, die von dem Benutzer bestellt wurden, den Sie löschen, oder setzen Sie ihn auf no Action , wenn Sie diese Bestellung beibehalten möchten.

Ich kann keine Alternativen für die Profilfrage vorschlagen, weil Sie nicht erwähnt haben, was Sie mit "müssen Benutzerprofildaten auf flexiblere Weise speichern und zugreifen, als der Profilanbieter unterstützt" gemeint haben.

    
Tim Schmelter 30.06.2011, 09:19
quelle
1

Sie sollten in Betracht ziehen, Ihren eigenen benutzerdefinierten Mitgliedschaftsanbieter zu schreiben, der die Tabellen / Daten gemäß Ihren Anforderungen verwendet (anstatt das von ASP.NET bereitgestellte Schema zu verwenden).

Siehe dieses MSDn-Beispiel ( Schema , Code ) zum Schreiben eines benutzerdefinierten Providers - dieses Beispiel verwendet OLEDB für den Zugriff auf die Datenbank. Ein weiteres Beispiel ist hier - es verwendet das aktive Verzeichnis als Speicher.

    
VinayC 30.06.2011 09:18
quelle