EF-6 - Ungültige Spalte name 'Diskriminator', zwei DbContexts
Habe ich ein MVC 5 app. Ich würde gerne die standard-aspnet.identity provider zu ermöglichen, Benutzer-login über das standard - \Account Ansichten. Allerdings habe ich auch eine Verbindung zu einem Drittanbieter-Datenbank und verwenden möchten EF code-first-für das auch.
Den Kontext für meine Datenbank, die ich nahm aus einem Scott Allen Pluralsight. Ich weiß nicht, warum oder was der "ApplicationUser" - Klasse tut Erben von der IdentityUser aber es arbeitete in seinem video und mit einer früheren website, die ich erstellt. Es sieht wie folgt aus:
namespace ESBAMPortal.DataLayer
{
//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
{
}
class PortalContext : IdentityDbContext<ApplicationUser>, ESBAMPortal.DataLayer.IPortalContext
{
public PortalContext()
: base("ESBamPortalConString")
{
this.Configuration.LazyLoadingEnabled = false;
}
public virtual DbSet<DomainClasses.Portal> Portal {get; set;}
}
}
Den Kontext für die third-party-Datenbank ist wie folgt:
namespace ESBAMPortal.DataLayer
{
public class ESBContext : DbContext, ESBAMPortal.DataLayer.IESBContext
{
public ESBContext()
: base("ESBExceptionConString")
{
this.Configuration.LazyLoadingEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public virtual DbSet<ActionType> ActionTypes { get; set; }
public virtual DbSet<Alert> Alerts { get; set; }
public virtual DbSet<AlertCondition> AlertConditions { get; set; }
public virtual DbSet<AlertEmail> AlertEmails { get; set; }
public virtual DbSet<AlertHistory> AlertHistories { get; set; }
public virtual DbSet<AlertSubscription> AlertSubscriptions { get; set; }
public virtual DbSet<AlertSubscriptionHistory> AlertSubscriptionHistories { get; set; }
public virtual DbSet<AuditLog> AuditLogs { get; set; }
public virtual DbSet<AuditLogMessageData> AuditLogMessageDatas { get; set; }
public virtual DbSet<Batch> Batches { get; set; }
public virtual DbSet<Configuration> Configurations { get; set; }
public virtual DbSet<ContextProperty> ContextProperties { get; set; }
public virtual DbSet<Fault> Faults { get; set; }
public virtual DbSet<Message> Messages { get; set; }
public virtual DbSet<MessageData> MessageDatas { get; set; }
public virtual DbSet<ProcessedFault> ProcessedFaults { get; set; }
public virtual DbSet<UserSetting> UserSettings { get; set; }
}
}
Wenn ich die website, die ich bin in der Lage zu ziehen die Daten aus dem third-party-website ok. Jedoch, wenn ich versuche mich einzuloggen erhalte ich die Meldung:
Invalid column name 'Discriminator'
Dieser geworfen wird, als ein Ergebnis der Herstellung der Aufruf:
var user = await UserManager.FindAsync(model.UserName, model.Password);
Ausführung EF-Profiler kann ich sehen, dass er versucht, führen Sie die folgende SQL:
SELECT [Limit1].[C1] AS [C1],
[Limit1].[Id] AS [Id],
[Limit1].[UserName] AS [UserName],
[Limit1].[PasswordHash] AS [PasswordHash],
[Limit1].[SecurityStamp] AS [SecurityStamp]
FROM (SELECT TOP (1) [Extent1].[Id] AS [Id],
[Extent1].[UserName] AS [UserName],
[Extent1].[PasswordHash] AS [PasswordHash],
[Extent1].[SecurityStamp] AS [SecurityStamp],
'0X0X' AS [C1]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE ([Extent1].[Discriminator] = N'ApplicationUser')
AND ((((UPPER([Extent1].[UserName])) = (UPPER('rob' /* @p__linq__0 */)))
AND (NOT ((UPPER([Extent1].[UserName]) IS NULL)
OR (UPPER('rob' /* @p__linq__0 */) IS NULL))))
OR ((UPPER([Extent1].[UserName]) IS NULL)
AND (UPPER('rob' /* @p__linq__0 */) IS NULL)))) AS [Limit1]
Problem ist, das AspNetUsersTable hat keine Diskriminator-Spalte.
Könnte bitte jemand erklären, wo ich schief gegangen und wie ich es beheben soll?
InformationsquelleAutor Rob Bowman | 2014-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ging ich zurück zu den basics, erstellt eine neue MVC 5 app erzeugt dann eine db-Migrationen durch ausführen der folgenden Optionen aus dem Paket-manager-Konsole:
Wenn ich überprüft den code, der generiert wurde, konnte ich sehen, dass es ein "Diskriminator" - Spalte in der Tabelle AspNetUsers.
Ich ging zurück zu meinem "richtigen" Lösung verglichen, die der 'ersten' migration code von meinem trennen DataAccess Projekt. Dieser code nicht über ein "Diskriminator-Spalte", habe ich auch bemerkt hatte, dass Sie zusätzliche Spalten wie "Telefonnummer" und "TwoFactorEnabled". Das machte mich denken, dass vielleicht die MVC5-Vorlage wurde mit einer früheren version des "Microsoft.AspNet.Identität.EntityFramework" - so stellte sich heraus, das der Fall sein.
Zu beheben, ging ich zu der Nuget-Pakete Verwalten dialog der MVC5 web-app, deinstalliert Sie "Microsoft.AspNet.Identität.EntityFramework"(v1.0), dann neu installiert (v2.0). Später, wenn ich ran login von der website, es nicht versucht zu finden, ein "Diskriminator" - Spalte und es hat alles Super geklappt.
Ich denke, dies hat mich gelehrt, eine wertvolle Lektion, die mehr bezahlen Aufmerksamkeit auf die Versionen, die auf Nuget-Pakete, die verwendet werden von VS-Vorlagen
userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
, und ich bin mit die Letzte stabile version 2.2.1basierend auf Ihre Antwort, ich habe die folgenden und es behoben das Problem durch aktualisieren auf die neueste version :
Install-Package Microsoft.AspNet.Identity.EntityFramework
InformationsquelleAutor Rob Bowman
weil die ASP.NET MVC-Projekt hat ein "ApplicationUser" - Klasse, die bereits übersteuert IdentityUser er fügt hinzu, die Diskriminator-Spalte, um das entity framework automatisch für Sie.
Versuchen Sie zum löschen der Daten Basis und erneut ausführen. wieder.
Überprüfen Sie diese http://forums.asp.net/t/1970682.aspx?ASP+NET+Identität+V2+Diskriminator+Spalte
InformationsquelleAutor Omar.Alani
Versuchen, löschen Sie die Datenbank und führen Sie erneut. wieder
Prüfen diese Frage
1. http://forums.asp.net/t/1970682.aspx?ASP+NET+Identität+V2+Diskriminator+Spalte.http://
Überprüfen Sie auch diese blogs.msdn.com/b/webdev/archive/2013/10/16/customizing-profile-information-in-asp-net-identity-in-vs-2013-templates.aspx
InformationsquelleAutor Omar.Alani
Dies geschieht für mich, wenn ich das hinzufügen zwei-Klassen geerbt von IdentityDbContext wenn so fügen Sie Diskriminator zu AspNetRoles
InformationsquelleAutor Abdullah Tahan