2017-07-27 60 views
0

我对UserManager.Create(...)有点困惑。Asp.Net身份不会在使用自定义用户时创建数据库

当我使用标准EntityFramework的IdentityUser来创建和添加一个新的用户一切正常。如果我的连接字符串Data Source=(LocalDb)\MSSQLLocalDB;Database=IdentityDemo;trusted_connection=yes;不存在,EntityFramework将创建一个数据库,并向数据库添加一个用户。
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); 
     } 

但是当我尝试用我自己的CustomUser,的EntityFramework什么都不做,我也得到在UserManager.Create(...)一个NullReferenceException。

这里是我的扩展CustomUser项目:

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级:

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

最后但并非最不重要的,CustomUserStore:

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

例外:

对象引用不设置为一个对象的一个​​实例

堆栈跟踪:

贝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(Task task) bei System.Runtime.CompilerServices.TaskAwaiter.Handl eNonSuccessAndDebuggerNotification(任务任务) bei Microsoft.AspNet.Identity.AsyncHelper.RunSync [函数](Func 1 func) bei Microsoft.AspNet.Identity.UserManagerExtensions.Create[TUser,TKey](UserManager 2 manager,TUser user,String password) bei Identity.Program.Main(String [] args)in E:\ syncplicity \ z003apfp \ Documents \ Visual Studio 2015 \ Projects \ Identity \ Identity \ Program.cs:Zeile 21. bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args) bei System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity ,字串[] args)

我使用的EntityFramework 6.1.0和2.2.1 AspNet.Identity.Core

我错过了什么配置,所以AspNet.Identity和EntityFrameworks在这里接受我自己的实现?

任何问题所在的帮助或想法,赞赏。

我已经尝试先建立数据库,然后尝试添加使用userManager.Create(new CustomUser {UserName = userName}, password)用户,而且当你重写你应该做它身份的整体结构,这导致相同的NullReferenceException

+0

发布整个NullRef异常。 – mxmissile

+0

我有点困惑。你想让ASP.NET Identity为你创建'Users'表,并使用该表代替'AspNetUsers'表吗? – Win

+0

是的,那正是我想要完成的。 – Yggraz

回答

0

例如您的数据库上下文应该使用这样的事情:

自定义上下文

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

自定义用户

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

自定义角色

CustomRole : IdentityRole<int, CustomUserRole> { } 

自定义用户登陆

public class CustomUserLogin : IdentityUserLogin<int> { } 

CustomUserClaim

public class CustomUserClaim : IdentityUserClaim<int> { } 

注意,就是一个例子你要跟应该根据自己的需要相适应。

相关问题