Was bindet ApplicationUser an die aspnetusers-Tabelle in Database First?

8

Ich habe ein Datenbank-erstes EDMX-Modell in einer separaten Bibliothek (zB Common.Feedback.Data ), das die Tabelle AspNetUser und die zugehörigen Identity Framework-Tabellen enthält (aus einer anderen bestehenden, funktionierenden Datenbank / Anwendung).

Ich habe die Verbindungszeichenfolge ApplicationDbContext aktualisiert, um auf das neue Modell und die neue Datenbankverbindung zu zeigen:

%Vor%

Die Verbindungszeichenfolge in der Datei web.config enthält den vollständigen Pfad zur Assembly, und dieser Verweis ist in Ordnung:

%Vor%

Zur Laufzeit führt jeder Zugriff auf die Anmeldung zu folgendem Fehler:

  

"Der Entitätstyp ApplicationUser ist nicht Teil des Modells für den aktuellen Kontext"

Alle Links, die ich versucht habe und die sich auf diesen Fehler beziehen, beinhalten normalerweise Möglichkeiten, die Migration zu aktualisieren.

Ich kann Migrationen nicht aktivieren, da es sich um eine Erstinstallation von EDMX handelt, aber ich nehme an, dass zwischen dem Objekt ApplicationUser und der Tabelle aspnetusers "irgendwo" hinter den Kulissen eine Verbindung besteht.

Hat jemand hier ein klares Verständnis davon, wie die Klasse ApplicationUser zur Laufzeit der Tabelle aspnetusers zugeordnet ist und wie man meinen Code für die Arbeit mit der Datenbank verwendet?

Repro-Schritte

  • Erstellen Sie eine neue MVC-Webanwendung mit VS 2013
  • Aktualisieren Sie alle NuGet-Pakete auf das neueste
  • Nehmen Sie eine vorhandene SQL-Datenbank mit den Identity Framework-Tabellen und kopieren Sie sie in eine neue Tabelle (entfernen Sie alle nicht verwandten Tabellen).
  • Fügen Sie neue Tabellen für das Projekt hinzu
  • Erstellen Sie eine Klassenbibliothek für die Datenmodelle (z. B. Common.Feedback.Data )
  • Fügen Sie ein Edmx-Datenmodell zur Bibliothek hinzu, basierend auf der zuvor erstellten Datenbank
  • Ändern Sie die Verbindungszeichenfolge, um die Assembly vollständig zu qualifizieren (nicht res://*/ )
  • Ändern Sie den Namen der Verbindungszeichenfolge in IdentityModel.cs , damit er mit dem Namen der Verbindungszeichenfolge in der Konfigurationsdatei übereinstimmt.
  • Kopieren Sie die Verbindungszeichenfolge aus dem app.config der Bibliothek in das web.config des Webprojekts.
  • Versuchen Sie sich anzumelden und Sie werden den Fehler
  • treffen

Aktualisierung:

Basierend auf einem streunenden Post habe ich meine Verbindungszeichenfolge so geändert, dass sie der normalen SQL-Verbindung entspricht, die das Identity Framework standardmäßig verwendet (und einen SQL-Client verwendet):

%Vor%

und zu Setup geändert, um diese neue Verbindung zu verwenden:

%Vor%

Seltsamerweise ändert sich der Fehler zu:

  

Die magische Zahl im GZip-Header ist nicht korrekt. Stellen Sie sicher, dass Sie einen GZip-Stream übergeben.

Ich denke, dass die anfängliche Änderung eines SqlClient-Anbieters korrekt ist. Dieser neue Fehler könnte daher mit der Verwendung einer Azure-Datenbank über diese Verbindung zusammenhängen. Ich bin offen für Vorschläge, was ich als nächstes versuchen soll.

Aktualisiert web.config auf Vorschlag von @rism und Dieser Link (aber der GZip-Fehler bleibt bestehen):

%Vor%

Auch auf der Grundlage von Tipps von @rism habe ich diese Version auch versucht (aber der GZip-Fehler bleibt bestehen):

%Vor%

Neues Update:

Ich habe eine brandneue Webanwendung mit der Option Benutzersicherheit erstellt. Ich habe auch eine leere Datenbank in Azure erstellt.

Ich habe nur die Standardverbindungszeichenfolge geändert:

%Vor%

und die Standard-Verbindungsfactory zu diesem:

%Vor%

Beim Versuch, mich einzuloggen, erhalte ich den folgenden Fehler:

  

Die magische Zahl im GZip-Header ist nicht korrekt. Stellen Sie sicher, dass Sie es sind   in einem GZip-Stream übergeben. Beschreibung: Eine nicht behandelte Ausnahme   aufgetreten während der Ausführung der aktuellen Web-Anfrage. Bitte   Überprüfen Sie den Stack-Trace, um weitere Informationen zum Fehler und zum Speicherort zu erhalten   es stammt aus dem Code.

     

Ausnahmedetails: System.IO.InvalidDataException: Die magische Zahl   in GZip Header ist nicht korrekt. Stellen Sie sicher, dass Sie einen GZip übergeben   streamen.

     

Quellfehler:

     

Zeile 153: {Zeile 154: var user = new   ApplicationUser {Benutzername = Modell.Email, Email = Modell.Email}; Linie   155: var result = erwarten UserManager.CreateAsync (Benutzer,   model.Password); Zeile 156: if (result.Succeeded) Linie   157: {

    
Gone Coding 27.01.2015, 22:21
quelle

1 Antwort

11

In der ursprünglichen Frage ging es darum, wie OWIN die Klasse ApplicationUser auf die Tabelle AspNetUsers abbildet.

Ich habe die Identity Framework-DLLs mit DotPeek dekompiliert und festgestellt, dass der Tabellenname "AspNetUsers" einfach in den Code der OnModelCreating -Methode verdrahtet ist. z.B.

%Vor%

Dieser Code verwendet Reflektion zum Generieren einer Liste von Feldnamen aus den Eigenschaften in ApplicationUser. Es prüft mit einer einfachen SQL-Abfrage (der Systemtabelle, die alle Feldnamen enthält) auf das Vorhandensein all dieser Feldnamen und bestätigt, dass sie alle vorhanden sind.

Der Rest ist eine einfache Zuordnung von Namen / Werten mit Hilfe konstruierter SQL-Abfragen.

Was den anderen Teil des Problems anbelangt, die Datenbankverbindung, habe ich eine neue Frage erstellt, da sie a) nicht mit dem Titel dieses Buches zusammenhängt und b) mich verrückt macht! Das neue Frage ist Warum bekomme ich" Die magische Nummer in GZip Header ist nicht korrekt. " Fehler bei Verwendung von OWIN auth gegen Azure SQL

    
Gone Coding 30.01.2015, 00:04
quelle