2013-10-28 8 views
12

Lo stock asp.net mvc applicazione 5 crea gli utenti dell'applicazione, alias gli utenti di identità in un contesto separato, chiamato un file chiamato "IdentityModels.cs" - sembra che questoCome si possono mettere gli utenti dell'applicazione nello stesso contesto del resto degli oggetti?

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
} 

Sto tentando di mettere il gli utenti delle applicazioni in un contesto dati regolare, vale a dire una cosa del genere

public class BlogProphetContext : DbContext 
    { 

     public DbSet<ApplicationUser> ApplicationUsers { get; set; } 
     public DbSet<Answer> Answers { get; set; } 
     public DbSet<Question> Questions { get; set; } 
     public DbSet<Tag> Tags { get; set; } 
    } 

Tuttavia, ogni volta che faccio che ottengo il seguente errore ogni volta che cercano di creare un account

The UserId field is required 

Nei AccountController.cs quando tento di execure la seguente riga di codice

result = await UserManager.AddLoginAsync(user.Id, info.Login); 

ho la sensazione il mio approccio è sbagliato, e che io non posso avere le ApplicationUsers nel file di contesto dati principali senza un qualche tipo di cavilli esterni - qualcuno sa in qualche modo di fare questo? Tutti i file sono aggiornati.

risposta

12

Questo è stato un po 'troppo facile - si scopre che tutto quello che hanno a che fare rimuovere il

<ApplicationUser> 

quando si chiama il contesto e tutto si rivela come ci si potrebbe aspettare (vale a dire le ipotesi MVC e gli sviluppatori ipotesi (in questo caso, il mio) di sincronizzazione.

.210

Qui si sta lavorando correttamente

public class MyContext : IdentityDbContext 
    { 
     public MyContext() 
      : base("DefaultConnection") 
     { 
     } 
     public DbSet<ApplicationUser> ApplicationUsers { get; set; } 
     public DbSet<Answer> Answers { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
      modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
     } 
    } 
+0

Lifesaver, questo mi preoccupava anche. Odiavo l'idea di avere due contesti: uno per il sottosistema Identity e l'altro per tutti gli altri dati per il mio progetto! – xingyu

0

io non sono sicuro se questo vi aiuterà o se ho capito pienamente le vostre domande ... ma se volete provare a utilizzare il proprio "modello" quindi modificare:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("PUT IN YOUR MODEL CONN HERE") 
    { 
    } 

Non so quanta più di questo puoi configurare o se questo cambierà davvero il contesto.

2

Assicurarsi che la classe eredita da ApplicationUser IdentityUser.

allora avete bisogno di configurare il contesto in modo che le mappe di tutte le classi ASP.NET Identità correttamente. Questi sono:

  1. ApplicationUser (la classe)
  2. IdentityUserClaim
  3. IdentityUserLogin
  4. IdentityUserRole
  5. IdentityRole

dettagli di questo è un po 'troppo complicato da postare qui, ma Ho creato un progetto di esempio che funziona con la versione di rilascio di ASP.NET Identity. Potete vederlo qui: https://github.com/onybo/Asp.Net-Identity-sample-app/tree/master/CustomUser

+0

Sono in realtà non si utilizza l'IdentityDbContext a tutti, vorrei trattare l'ApplicationUser proprio come una qualsiasi altra classe per (estensioni e le proprietà correlate, ecc - è stato lavorando in modo strano nella beta) Mi chiedo se c'è un modo per NON utilizzare l'IdentityDBContext. –

+0

E ho tutto aggiornato con le ultime versioni - Sto aggiornando la domanda ora. –

+0

Ok, ho aggiornato la mia risposta e incluso un collegamento a un progetto di lavoro che penso faccia quello che stai cercando. –

3

In questo caso, se non volete la vostra ApplicationUser da associare Identity asp.net la cosa più semplice sarebbe quello di eliminare solo l'eredità dalla classe ApplicationUser.

Go da ApplicationUser: IdentityUser a poco ApplicationUser, poi in quella classe basta creare una proprietà Id.

Quindi non è necessario utilizzare IdentityDBContext.

Naturalmente si dovrà riscrivere totalmente AccountController, o sbarazzarsi di esso. Non puoi utilizzare UserManager comunque come questo è legato al IdentityUser

Poi, ovviamente, assicuratevi di aggiungere il database/aggiornamento di migrazione, se si sta lavorando con EF.

Se si vuole mantenere il controllo account come è e tenere IdentityDbContext ma aggiungere altre entità, allora questo è facile, basta fare questo:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() : base("DefaultConnection") 
    { 
    } 

    public DbSet<Dept> Dept{ get; set; } 
    public DbSet<Course> Course{ get; set; } 
    public DbSet<Etc> Etc{ get; set; } 
} 
Problemi correlati