2013-11-15 55 views
57

我想mydbcontext整合IdentityContext,但我采取这一错误模型生成过程中检测到Asp.net身份验证错误

一个或多个验证错误:

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 
{ 

} 

回答

152

您的代码简化版,显示这一点,但是从错误中你得到我假设你要重写OnModelCreating.This就是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 }); 
} 
+0

我敢肯定,我可以找到关于EF您的正确答案Code First方法,在我需要的时候在StackOverFlow中。谢谢 –

+0

我创建了OnModelCreating覆盖,所以我可以添加modelBuilder.Conventions.Remove ();为了防止EF复制我的表名,并且在第一次尝试添加迁移时遇到这种情况。感谢您的非常有帮助的答案Olav – GDB

+0

你好Olav,这解决了我没有定义错误的错误,但现在我得到无数的列名错误。我已经发布在这里http://stackoverflow.com/questions/23346422/identity-2-usermanager-find-throws-invalid-object-name-dbo-applicationuser-e。你会对此有所了解吗?谢谢,乔 – Joe

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的关键只在用户ID,你DbEntityVa使用默认的Google登录时发生lidationExceptions。

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 
}