2013-11-15 6 views
57

voglio integrare IdentityContext con mydbcontext ma io sto prendendo questo errore sono stati rilevatiAsp.net Identità Errore di convalida

uno o più errori di convalida durante la generazione del modello:

Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserLogin: : EntityType 'IdentityUserLogin' non ha una chiave definita. Definire la chiave per questo EntityType. Ivdb.Dal.Concrete.EFCodeFirst.IdentityUserRole:: EntityType 'IdentityUserRole' non ha alcuna chiave definita. Definire la chiave per questo EntityType. IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' è basato sul tipo 'IdentityUserLogin' che non ha chiavi definite. IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' è basato sul tipo 'IdentityUserRole' che non ha chiavi definite.

Come posso risolvere questo?

Codice:

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

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


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

utente Applicazione

public class ApplicationUser : IdentityUser 
{ 

} 

risposta

152

Il codice does't mostrare questo, ma dagli errori si sono sempre Presumo questo modo si sostituisce OnModelCreating.This è dove IdentityDbContext<ApplicationUser> configure le associazioni del framework di entità. Ciò significa che se si desidera eseguire l'override di OnModelCreating è necessario chiamare la base o eseguire autonomamente la mappatura.

Quindi o questo:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    // your stuff here 
} 

O si fa la mappatura:

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

Sono sicuro di poter trovare risposte corrette su EF Codice Primo approccio, in StackOverFlow ogni volta che ne ho bisogno. grazie –

+0

Ho creato un override su OnModelCreating in modo da poter aggiungere modelBuilder.Conventions.Remove (); per impedire a EF di pluralizzare i nomi delle mie tabelle e questo mi ha morso al primo tentativo di aggiungere una migrazione. Grazie per la tua risposta molto utile Olav – GDB

+0

Ciao Olav, Questo ha risolto il mio errore senza chiave definita, ma ora ottengo numerosi errori di nome di colonna non valido. Ho pubblicato qui http://stackoverflow.com/questions/23346422/identity-2-usermanager-find-throws-invalid-object-name-dbo-applicationuser-e. Avresti qualche idea su questo. Grazie, Joe – Joe

6

Se non si desidera chiamare base.OnModelCreating e vogliono fare la propria mappatura, la mappatura dovrebbe simile a questa:

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

Se si mette la chiave per IdentityUserLogin solo su UserId, si ottiene DbEntityVa lidationExceptions quando si utilizza il login google predefinito.

3

il take away è che non si può avere un OnModelCreating vuoto

Buono

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

Bad

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