我对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 [函数](Func1 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
发布整个NullRef异常。 – mxmissile
我有点困惑。你想让ASP.NET Identity为你创建'Users'表,并使用该表代替'AspNetUsers'表吗? – Win
是的,那正是我想要完成的。 – Yggraz