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="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user [email protected];password=mypassword;MultipleActiveResultSets=True;App=EntityFramework""
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 dasweb.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: {
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
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
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