2017-07-27 2 views
0

Ich bin ein wenig verwirrt über UserManager.Create(...).Asp.Net Identität erstellt keine Datenbank bei Verwendung benutzerdefinierter Benutzer

Wenn ich die IdentityUser Standard EntityFramework zum Erstellen und Hinzufügen eines neuen Benutzers verwenden, funktioniert alles einwandfrei. EntityFramework erstellt eine Datenbank, wenn keine mit meinem Connectionstring existiert Data Source=(LocalDb)\MSSQLLocalDB;Database=IdentityDemo;trusted_connection=yes; und fügt einen Benutzer der Datenbank hinzu.
ExampleProgram:

static void Main(string[] args) 
     { 
      var username = "ygg"; 
      var password = "Password123!"; 

      var userStore = new UserStore<IdentityUser>(); 
      var userManager = new UserManager<IdentityUser>(userStore); 
      var creationResult = userManager.Create(new IdentityUser(username), password); 
     } 

Aber wenn ich versuche, mein eigenes CustomUser zu verwenden, EntityFramework tut nichts und ich eine Nullreferenceexception bei UserManager.Create(...) bekommen.

Hier ist mein Erweiterte CustomUser Projekt:

static void Main(string[] args) 
    { 
     var userName = "Ygg"; 
     var password = "Password123!"; 

     var userStore = new CustomUserStore(new CustomUserDbContext()); 
     var userManager = new UserManager<CustomUser, int>(userStore); 

     var creationResult = userManager.Create(
       new CustomUser {UserName = userName}, password); //<--- Exception Here      
    } 

CustomUser-Klasse:

public class CustomUser : IUser<int> 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public string PasswordHash { get; set; } 
} 

CustomUserDbContext:

public class CustomUserDbContext : IdentityDbContext 
{ 
    public CustomUserDbContext() : base("DefaultConnection") 
    { 

    } 

    public DbSet<CustomUser> Users { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     var user = modelBuilder.Entity<CustomUser>(); 
     user.ToTable("Users"); 
     user.HasKey(x => x.Id); 
     user.Property(x => x.Id).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     user.Property(x => x.UserName).IsRequired().HasMaxLength(256) 
      .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UserNameIndex") { IsUnique = true })); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

Und lesen but not least, CustomUserStor:

public class CustomUserStore : IUserPasswordStore<CustomUser, int> 
{ 
    private readonly CustomUserDbContext _context; 

    public CustomUserStore(CustomUserDbContext context) 
    { 
     _context = context; 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 

    public Task CreateAsync(CustomUser user) 
    { 
     _context.Users.Add(user); 
     return _context.SaveChangesAsync(); 
    } 
    . 
    . 
    . 
} 

Ausnahme:

Objektverweis nicht

Stacktrace auf eine Instanz eines Objekts festgelegt:

bei Microsoft.AspNet.Identity.UserManager 2.<UpdatePassword>d__39.MoveNext() bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) bei Microsoft.AspNet.Identity.UserManager 2.d__d.MoveNext() bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Aufgabe Aufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.Handl eNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.AspNet.Identity.AsyncHelper.RunSync [TResult] (Func 1 func) bei Microsoft.AspNet.Identity.UserManagerExtensions.Create[TUser,TKey](UserManager 2 Manager, TUser Benutzer, String-Passwort) bei Identity.Program.Main (String [] args) in E: \ Syncplicity \ z003apfp \ Dokumente \ Visual Studio 2015 \ Projekte \ Identität \ Identität \ Programm.cs: Zeile 21. bei System.AppDomain._nExecuteAssembly (RuntimeAssembly Assembly, String [] Args) bei System.AppDomain.ExecuteAssembly (String AssemblyFile, Evidence AssemblySecurity , String [] args)

ich verwende EntityFramework 6.1.0 und 2.2.1 AspNet.Identity.Core

Habe ich etwas zu konfigurieren vermisst, so akzeptiert AspNet.Identity und EntityFrameworks meine eigenen Implementierungen hier?

Jede Hilfe oder Gedanken, wo das Problem liegt, wird geschätzt.

Ich habe bereits versucht, die Datenbank zuerst zu erstellen und dann versuchen, einen Benutzer mit userManager.Create(new CustomUser {UserName = userName}, password) hinzufügen, aber dies führt auch zu der gleichen Nullreferenceexception

+0

Veröffentlichen Sie die gesamte NullRef-Ausnahme. – mxmissile

+0

Ich bin ein bisschen verwirrt. Möchten Sie, dass ASP.NET Identity die Tabelle "Users" für Sie erstellt und diese Tabelle anstelle der Tabelle "AspNetUsers" verwendet? – Win

+0

Ja, genau das möchte ich erreichen. – Yggraz

Antwort

0

Wenn Sie etwas außer Kraft setzen Sie es für die ganze Struktur der Identität tun sollen.

Zum Beispiel Ihre DB Kontext sollte wie folgt verwendet werden:

Benutzerdefinierte Context

CustomUserDbContext : IdentityDbContext<CustomUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim> 

benutzerdefinierten Benutzer

User : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim> 

benutzerdefinierte Rolle

CustomRole : IdentityRole<int, CustomUserRole> { } 

Individuelle Userlogin

public class CustomUserLogin : IdentityUserLogin<int> { } 

CustomUserClaim

public class CustomUserClaim : IdentityUserClaim<int> { } 

Beachten Sie, dass ein Beispiel war yous nach Ihrem Bedarf anpassen sollte.

Verwandte Themen