Entity framework EF 6-无效的列名';鉴别器';,两个dbcontext

Entity framework EF 6-无效的列名';鉴别器';,两个dbcontext,entity-framework,ef-code-first,dbcontext,asp.net-identity,Entity Framework,Ef Code First,Dbcontext,Asp.net Identity,我有一个MVC5应用程序。我想使用标准aspnet.identity提供程序启用用户通过标准\帐户视图登录。但是,我还需要连接到第三方数据库,并希望首先为此使用EF代码 我从Scott Allen Pluralsight获取的主数据库的上下文。我不知道为什么或者“ApplicationUser”类继承了IdentityUser类做了什么,但它在他的视频和我之前创建的网站中起了作用。情况如下: namespace ESBAMPortal.DataLayer { // You can add

我有一个MVC5应用程序。我想使用标准aspnet.identity提供程序启用用户通过标准\帐户视图登录。但是,我还需要连接到第三方数据库,并希望首先为此使用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; }
    }
}
这是由于进行调用而引发的:

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没有鉴别器列


有人能解释一下我哪里出了问题,以及我应该如何修复吗?

因为ASP.NET MVC项目有一个“ApplicationUser”类,它已经覆盖了Identity,它会自动将鉴别器列添加到实体框架中。 尝试删除数据库并重新运行。再说一遍


选中此复选框,尝试删除数据库并重新运行。再次

检查这个问题 1.


另请查看blogs.msdn.com/b/webdev/archive/2013/10/16/customing-profile-information-in-asp-net-identity-in-vs-2013-templates.aspx

我回到了基础,创建了一个新的MVC 5应用程序,然后通过从package manager控制台运行以下命令生成了一个db迁移:

  • 启用迁移
  • 首先添加“迁移”
当我检查生成的代码时,我可以看到它在AspNetUsers表中包含了一个“Discriminator”列。 我回到我的“真实”解决方案,比较了我单独的DataAccess项目中的“第一”迁移代码。这段代码没有“Discriminator”列,我还注意到它有额外的列,如“PhoneNumber”和“twofacturenabled”。这让我觉得MVC5模板可能使用的是以前版本的“Microsoft.AspNet.Identity.EntityFramework”——事实证明就是这样

为了解决这个问题,我转到MVC5 web应用程序的Manage Nuget Packages对话框,卸载了“Microsoft.AspNet.Identity.EntityFramework”(v1.0),然后重新安装(v2.0)。后来,当我从网站登录时,它没有试图找到一个“鉴别器”栏,一切都很好


我想这给了我一个宝贵的教训,让我更加关注VS Templates使用的Nuget软件包上的版本

当我添加从IdentityDbContext继承的两个类时,这种情况就发生了,如果是这样,请向AspNetRoles添加鉴别器

AddColumn("dbo.AspNetRoles", "Discriminator", c => c.String(nullable: false, maxLength: 128));

我使用了上面接受的解决方案,但我投票支持了你的解决方案,因为它也能工作。我在尝试注册用户时遇到了相同的问题,在
userIdentity=wait manager.createidentitysync(这是DefaultAuthenticationTypes.applicationcokie),我正在使用最新的稳定版本2.2.1根据您的回答,我执行了以下操作,并通过更新到最新版本解决了问题:
安装包Microsoft.AspNet.Identity.EntityFramework
AddColumn("dbo.AspNetRoles", "Discriminator", c => c.String(nullable: false, maxLength: 128));