8

Ich habe ein Datenbank-erstes EDMX-Modell in einer separaten Bibliothek (z. B. Common.Feedback.Data), das die Tabelle AspNetUser und die zugehörigen Identity Framework-Tabellen enthält (aus einer anderen bestehenden, funktionierenden Datenbank/Anwendung).Was bindet ApplicationUser an die Aspnetusers-Tabelle in Database First?

Ich aktualisierte die ApplicationDbContext Verbindungszeichenfolge auf das neue Modell und neue Datenbankverbindung Punkt:

using System.Data.Entity; 
using System.Security.Claims; 
using System.Threading.Tasks; 
using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.EntityFramework; 

namespace Feedback.MvcApplication.Models 
{ 
    // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. 

    public class ApplicationUser : IdentityUser 
    { 
     public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
     { 
      // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
      var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
      // Add custom user claims here 
      return userIdentity; 
     } 
    } 

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     public ApplicationDbContext() 
      : base("FeedbackEntities", throwIfV1Schema: false) 
     { 
     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 
    } 
} 

Die Verbindungszeichenfolge in der web.config enthält den vollständigen Pfad zu der Montage und Referenz ist in Ordnung:

<add name="FeedbackEntities" 
    connectionString="metadata=res://Common.Feedback.Data/FeedbackModel.csdl|res://Common.Feedback.Data/FeedbackModel.ssdl|res://Common.Feedback.Data/FeedbackModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user [email protected];password=mypassword;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

zur Laufzeit jeder Zugriff Ergebnisse in der folgenden Fehler melden:

"The entity type ApplicationUser is not part of the model for the current context"

Alle Links, die ich in Bezug auf diesen Fehler ausprobiert habe, beinhalten normalerweise die Aktualisierung der Migration.

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

Hat jemand hier ein klares Verständnis davon, wie die ApplicationUser Klasse zur Laufzeit der Tabelle aspnetusers zugeordnet ist und erklären, wie ich meinen Code mit der Datenbank arbeiten?

Repro Schritte

  • Erstellen Sie eine neue Web Application MVC mit VS 2013
  • aktualisieren alle NuGet Pakete neuesten
  • eine vorhandene SQL-Datenbank mit den Rahmen Tabellen Identität nehmen und kopieren Sie sie in ein neue Tabelle (streichen Sie alle nicht verwandten Tabellen aus).
  • Hinzufügen neuer Tabellen für das Projekt
  • eine Klassenbibliothek Erstellen Sie die Datenmodelle zu halten (zB Common.Feedback.Data)
  • ein edmx Datenmodell hinzufügen, in der Bibliothek, auf der Basis der zuvor erstellten Datenbank
  • Verbindung ändern Zeichenfolge, um die Assembly vollständig zu qualifizieren (nicht res://*/)
  • Ändern Sie den Verbindungszeichenfolgennamen in IdentityModel.cs, um den Verbindungszeichenfolgennamen in der Konfiguration zu entsprechen.
  • Kopieren Sie die Verbindungszeichenfolge aus der Bibliothek der app.config auf das web.config
  • Try Login Web-Projekt, und Sie werden die Fehler erwähnten

Update-Hit:

Basierend auf einer Streu Post, änderte ich Meine Verbindungszeichenfolge stimmt mit der normalen SQL-Verbindung überein, die das Identity Framework standardmäßig verwendet (und einen SQL-Client verwendet):

und geänderte Einrichtung diese neue Verbindung zu verwenden:

public ApplicationDbContext() 
     : base("FeedbackSql", throwIfV1Schema: false) 
    { 
    } 

Seltsamer die Fehler Änderungen:

The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.

Ich denke, die anfängliche Änderung an ein SqlClient-Provider korrekt ist, so dass dieser neue Fehler kann sich auf die Verwendung einer Azure-Datenbank über diese Verbindung beziehen. Ich bin offen für Vorschläge, was ich als nächstes versuchen soll.

Aktualisiert web.config basierend auf Vorschlag von @rism und this link (aber die GZIP Fehlern weiterhin):

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
     <parameters> 
     <!--<parameter value="mssqllocaldb" />--> 
     <parameter value="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=myuserid;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

Wieder basierend auf Tipps von @rism Ich habe auch versucht, diese Version (aber der GZIP Fehler bestehen bleibt) :

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v12.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

neues Update:

ich mit dem Standard eine brandneue Web-Anwendung erstellt Benutzer-Sicherheit Option. Ich habe auch eine leere Datenbank in Azure erstellt.

Ich habe nichts anderes als die Zeichenfolge diese Standardverbindung ändern:

<connectionStrings> 
    <add name="DefaultConnection" 
     connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

und die Standardverbindung Fabrik dazu:

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v12.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

Beim Versuch, ich folgende Fehlermeldung erhalten, um sich einzuloggen:

The magic number in GZip header is not correct. Make sure you are passing in a GZip stream. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.InvalidDataException: The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.

Source Error:

Line 153: { Line 154: var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; Line 155: var result = await UserManager.CreateAsync(user, model.Password); Line 156: if (result.Succeeded) Line 157: {

+1

Wenn Sie die Route einer DB-erste Lösung gehen, gibt es keinen Grund, mit dem 'ApplicationDbContext' zu bleiben. Sie könnten einfach all diesen Müll entfernen, Ihren eigenen DbContext haben und sich Kopfschmerzen sparen – Shoe

+0

Sie haben nur den Konstruktor für ApplicationDbContext() gezeigt, können Sie die ganze Klasse zeigen. Auch welche Version von Identity verwendest du? Version 1.0 unterscheidet sich grundlegend von Version 2. Die Zuordnung zwischen Klassen und Tabellen erfolgt über Unterklassen von EntityTypeConfiguration, in denen Sie Aspekte des Modells wie referenzielle Integrität, Kardinalität usw. einrichten. Wenn Sie Fluent Api in einer TspIdentityMap verwenden: EntityTypeConfiguration Sie würde eine Aussage wie diese machen.ToTable ("AspNetUsers"); Sie ordnen die Codeklassenentität TspIdentity der db-Tabelle zu. – rism

+0

Der Grund, warum ich den gesamten ApplicationDbContext sehen möchte, ist, dass die Nachricht für mich liest, als hätte ich kein DbSet in Ihrem Kontext, das würde normalerweise einen Compilerfehler erzeugen ... aber dann haben Sie gemischt und Passende Bits, also sehen wir alle gleich. Stellen Sie außerdem sicher, dass Sie in allen Projekten die gleiche Version von Identity verwenden. – rism

Antwort

11

Die ursprüngliche Frage war, wie OWIN diezuordnenKlasse in die AspNetUsers Tabelle.

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

protected virtual void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     if (modelBuilder == null) 
     throw new ArgumentNullException("modelBuilder"); 
     EntityTypeConfiguration<TUser> typeConfiguration1 = ((EntityTypeConfiguration<TUser>) modelBuilder.Entity<TUser>()) 
     .ToTable("AspNetUsers"); 

Dieser Code verwendet Reflektion, um eine Liste von Feldnamen aus den Eigenschaften in ApplicationUser zu erzeugen. 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 konstruierten SQL-Abfragen.

Wie für den anderen Teil des Problems, die Datenbankverbindung, habe ich eine neue Frage erstellt, da es a) unabhängig von dem Titel dieses und b) mich verrückt macht! Die neue Frage ist Why am I getting "The magic number in GZip header is not correct." error using OWIN auth against Azure SQL

Verwandte Themen