57

我想将 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
{

}
4

3 回答 3

152

您的代码没有显示这一点,但是从您得到的错误中,我假设您正在覆盖 OnModelCreating。这是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 });
}
于 2013-11-15T07:45:26.433 回答
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。

于 2014-01-25T17:16:59.310 回答
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
}
于 2014-08-27T11:46:30.643 回答