【问题标题】:Asp.net Identity Validation ErrorAsp.net 身份验证错误
【发布时间】:2013-11-28 11:06: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
{

}

【问题讨论】:

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


    【解决方案1】:

    您的代码没有显示这一点,但根据您收到的错误,我假设您正在覆盖 OnModelCreating。这是 IdentityDbContext&lt;ApplicationUser&gt; 配置实体框架映射的地方。这意味着,如果您想覆盖 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 });
    }
    

    【讨论】:

    • 我确信我可以在需要时在 StackOverFlow 中找到有关 EF Code First 方法的正确答案。谢谢
    • 我在 OnModelCreating 上创建了一个覆盖,所以我可以添加 modelBuilder.Conventions.Remove();以防止 EF 使我的表名复数,这让我在第一次尝试添加迁移时感到困惑。感谢您非常有帮助的回答奥拉夫
    • 你好 Olav,这解决了我没有定义键的错误,但现在我收到了许多无效的列名错误。我在这里发帖stackoverflow.com/questions/23346422/…。您对此有何见解。谢谢你,乔
    • base.OnModelCreating(modelBuilder);为我工作,我有现有的用户,所以不想做任何激进的事情。谢谢奥拉夫
    • 复制粘贴一些 AppHarbor 的文档代码后出现此错误。谢谢!
    【解决方案2】:

    如果您不想调用 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。

    【讨论】:

      【解决方案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
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-31
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多