2013-11-15 53 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 
}