我有一个MVC 5应用程序。我想使用标准的aspnet.identity提供程序来启用用户通过标准\ Account视图登录。但是,我还需要连接到第三方数据库,并且也希望首先使用EF代码。
我从Scott Allen Pluralsight获取的主数据库的上下文。我不知道为什么或者#34; ApplicationUser" class正在继承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'
这是因为打电话而引发的:
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没有鉴别器列。
有人可以解释我出错的地方以及我应该如何解决?
答案 0 :(得分:7)
我回到基础,创建了一个新的MVC 5应用程序,然后通过从包管理器控制台运行以下代码来生成数据库迁移:
当我检查生成的代码时,我可以看到它包含了一个&#34; Discriminator&#34; AspNetUsers表中的列。 我回到了我的真实&#34;解决方案和比较,第一&#39;我单独的 DataAccess 项目中的迁移代码。这段代码没有&#34; Discriminator&#34;专栏,我还注意到它有其他列,例如&#34; PhoneNumber&#34;和&#34; TwoFactorEnabled&#34;。这让我觉得MVC5模板可能正在使用以前版本的&#34; Microsoft.AspNet.Identity.EntityFramework&#34; - 事实证明是这样的。
为了解决这个问题,我去了MVC5网络应用程序的 Manage Nuget Packages 对话框,卸载了&#34; Microsoft.AspNet.Identity.EntityFramework&#34;(v1.0)然后重新安装(V2.0)。随后当我从网站登录时,它没有试图找到一个&#34;鉴别器&#34;专栏,一切都很好。
我想这给了我一个宝贵的教训,让我更加关注VS模板使用的Nuget包上的版本
答案 1 :(得分:1)
因为ASP.NET MVC项目有一个已经覆盖IdentityUser的“ApplicationUser”类,它会自动将Discriminator列添加到实体框架中。 尝试删除数据库并重新运行。试。
选中此http://forums.asp.net/t/1970682.aspx?ASP+NET+Identity+V2+Discriminator+Column
答案 2 :(得分:0)
尝试删除数据库并重新运行。再次
检查此问题 1. http://forums.asp.net/t/1970682.aspx?ASP+NET+Identity+V2+Discriminator+Column.http://
另请查看此blogs.msdn.com/b/webdev/archive/2013/10/16/customizing-profile-information-in-asp-net-identity-in-vs-2013-templates.aspx
答案 3 :(得分:0)
当我添加从IdentityDbContext继承的两个类(如果是这样)时,这种情况对我来说会发生:
AddColumn("dbo.AspNetRoles", "Discriminator", c => c.String(nullable: false, maxLength: 128));