Asp.net身份验证错误

时间:2013-11-15 06:08:06

标签: asp.net-mvc-5 asp.net-identity

我想将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',没有定义键。

我该如何解决这个问题?

代码:

 public partial class ivdbDb156978Context : IdentityDbContext<ApplicationUser> 
{
    static ivdbDb156978Context()
    {
        Database.SetInitializer<ivdbDb156978Context>(null);
    }

    public ivdbDb156978Context()
        : base("Name=ivdbContext")
    {
    }


    public DbSet<Car> Cars { get; set; }

申请用户

    public class ApplicationUser : IdentityUser
{

}

3 个答案:

答案 0 :(得分:152)

你的代码没有显示这个,但是从你得到的错误中我假设你重写了OnModelCreating.T这是IdentityDbContext<ApplicationUser>配置实体框架映射的地方。这意味着如果要覆盖OnModelCreating,则需要调用基础,或者必须自己进行映射。

所以要么:

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

答案 1 :(得分:6)

如果您不想调用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});
}

如果您仅将IdentityUserLogin的密钥放在UserId上,则在使用默认的Google登录时会获得DbEntityValidationExceptions。

答案 2 :(得分:3)

外卖是你不能有一个空的OnModelCreating

不可

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

<强>为

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