Entity framework EF 6-无效的列名';鉴别器';,两个dbcontext
我有一个MVC5应用程序。我想使用标准aspnet.identity提供程序启用用户通过标准\帐户视图登录。但是,我还需要连接到第三方数据库,并希望首先为此使用EF代码 我从Scott Allen Pluralsight获取的主数据库的上下文。我不知道为什么或者“ApplicationUser”类继承了IdentityUser类做了什么,但它在他的视频和我之前创建的网站中起了作用。情况如下: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
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迁移:
- 启用迁移
- 首先添加“迁移”
我想这给了我一个宝贵的教训,让我更加关注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));