Asp.net mvc 5 Asp.net身份验证错误

Asp.net mvc 5 Asp.net身份验证错误,asp.net-mvc-5,asp.net-identity,Asp.net Mvc 5,Asp.net Identity,我想将IdentityContext与mydbcontext集成,但我接受了此错误 在模型生成过程中检测到一个或多个验证错误: Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserLogin::EntityType“IdentityUserLogin”未定义键。定义此EntityType的键。 Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserRole::EntityType“IdentityUserRole”未定义键。定义此En

我想将IdentityContext与mydbcontext集成,但我接受了此错误

在模型生成过程中检测到一个或多个验证错误:

Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserLogin::EntityType“IdentityUserLogin”未定义键。定义此EntityType的键。 Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserRole::EntityType“IdentityUserRole”未定义键。定义此EntityType的键。 IdentityUserLogins:EntityType:EntitySet“IdentityUserLogins”基于未定义键的类型“IdentityUserLogin”。 IdentityUserRoles:EntityType:EntitySet“IdentityUserRoles”基于未定义键的类型“IdentityUserRole”

我怎样才能解决这个问题

代码:


您的代码没有显示这一点,但是从您遇到的错误来看,我假设您正在重写ModelCreating。这就是
IdentityDbContext
配置实体框架映射的地方。这意味着,如果要覆盖OnModelCreating,则需要调用base,或者必须自己进行映射

因此,要么:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    // your stuff here
}
或者您执行映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasKey(l=>l.UserId);
modelBuilder.Entity().HasKey(r=>r.Id);
modelBuilder.Entity().HasKey(r=>new{r.RoleId,r.UserId});
}

如果您不想调用base.OnModelCreating并希望自己进行映射,则映射应如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id).Property(p => p.Name).IsRequired();
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
    modelBuilder.Entity<IdentityUserLogin>().HasKey(u => new {u.UserId, u.LoginProvider, u.ProviderKey});
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasKey(r=>r.Id).Property(p=>p.Name).IsRequired();
modelBuilder.Entity().HasKey(r=>new{r.RoleId,r.UserId});
modelBuilder.Entity().HasKey(u=>new{u.UserId,u.LoginProvider,u.ProviderKey});
}

如果将IdentityUserLogin的键仅放在UserId上,则在使用默认google登录时会出现DbEntityValidationExceptions。

需要注意的是,在创建模型时不能有一个空的

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);
  // your stuff here
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  // base.OnModelCreating(modelBuilder);
  // your stuff here
}
坏的

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);
  // your stuff here
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  // base.OnModelCreating(modelBuilder);
  // your stuff here
}

我相信我可以在StackOverFlow中找到关于EF代码优先方法的正确答案,无论何时我需要它。thanksI在ModelCreating上创建了一个覆盖,这样我就可以添加modelBuilder.Conventions.Remove();为了防止EF对我的表名进行复数化,这在我第一次尝试添加迁移时就对我造成了影响。感谢您非常有用的回答OlavHello Olav,这解决了我的无键定义错误,但现在我得到了许多无效列名错误。我已经在这里发布了。你对此有什么见解吗。谢谢你,Joebase.OnModelCreating(modelBuilder);为我工作,我有现有的用户,所以不想做任何激进的。感谢OlavI在复制粘贴了一些AppHarbor的文档代码后出现了这个错误。谢谢