我有一个MVC 5应用程序。我想使用标准的aspnet.identity提供程序来通过标准\ Account视图启用用户登录。但是,我还需要连接到第三方数据库,并且也要为此使用EF代码优先。

我从Scott Allen Pluralsight获得的主数据库上下文。我不知道为什么“ApplicationUser”类正在从IdentityUser继承或做什么,但是它在他的视频以及我创建的以前的网站中都起作用。它看起来如下:

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;}
    }
}

第三方数据库的上下文如下:
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; }
    }
}

当我运行该网站时,可以从第三方网站中提取数据。但是,当我尝试登录时会收到以下消息:
Invalid column name 'Discriminator'

这是由于进行 call 而引发的:
var user = await UserManager.FindAsync(model.UserName, model.Password);

运行EF Profiler,我可以看到它正在尝试执行以下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]

问题是,AspNetUsersTable没有鉴别符列。

谁能解释我哪里出了问题以及如何解决?

最佳答案

我回到基础知识,创建了一个新的MVC 5应用程序,然后通过从程序包管理器控制台运行以下命令来生成数据库迁移:

  • enable-migrations
  • add-migration'第一个

  • 当我检查生成的代码时,我可以看到它在AspNetUsers表中包含一个“Discriminator”列。
    我回到我的“实际”解决方案,并比较了我单独的DataAccess项目中的“第一个”迁移代码。该代码没有“Discriminator”列,我还注意到它还有其他列,例如“PhoneNumber”和“TwoFactorEnabled”。这使我认为MVC5模板可能正在使用早期版本的“Microsoft.AspNet.Identity.EntityFramework”-事实证明是这样。

    为了解决该问题,我转到了MVC5 Web应用程序的“管理Nuget程序包”对话框,先卸载“Microsoft.AspNet.Identity.EntityFramework”(v1.0),然后重新安装(v2.0)。随后,当我从网站登录时,它没有试图找到“discriminator”列,并且一切正常。

    我想这给了我一个宝贵的教训,让我更多地关注VS模板使用的Nuget软件包的版本。

    关于entity-framework - EF 6-无效的列名'Discriminator',两个DbContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26426926/

    10-12 23:20