Chr*_*Fin 3 c# asp.net-mvc entity-framework asp.net-identity-2
我刚刚将我的MVC 5应用程序(之前是MVC 3 SimpleMembership)升级到ASP.NET Identity 2.0,我可以与现有用户一起工作,但是当我执行以下操作来创建新用户时:
var user = new ApplicationUser();
//user.Id = db.Users.Max(u => u.Id) + 1; //does not help
user.UserName = model.UserName;
user.Email = model.EMailAddress;
var result = await UserManager.CreateAsync(user, model.Password);
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
System.Data.Entity.Core.UpdateException:更新条目时发生错误.有关详细信息,请参阅内部异常 ---> System.Data.SqlClient.SqlException:无法将值NULL插入列'Id',表'MyDB.dbo.AspNetUsers'; 列不允许空值.INSERT失败.该语句已终止.
有谁知道为什么会这样?
这是我的UserManager:
var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get<MyDbContext>()));
manager.UserValidator = new UserValidator<ApplicationUser, int>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
manager.EmailService = new EmailService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, int>(dataProtectionProvider.Create("ASP.NET Identity"));
}
Run Code Online (Sandbox Code Playgroud)
我int为用户和角色使用密钥,但我string之前和之前都有默认密钥,并且Id没有填充,我也遇到了类似的错误.
我发现这个问题:
因为我改变从键string到int以下迁移创建:
AlterColumn("dbo.AspNetUsers", "Id", c => c.Int(nullable: false, identity: true));
Run Code Online (Sandbox Code Playgroud)
它正确生成identity: true,但MSSQL无法将现有列转换为标识列=>该列成为"正常INT列".
然后,Identity必须认为该列是标识列并null作为键插入,并期望DB生成id => exception.
解决方案是SimpleMembership从旧备份恢复到我的数据库,并在创建-table时直接将其转换为ASP.NET Identity使用-key.intAspNetUsers
PS:但我仍然不知道为什么我和string-keys 有类似的问题,但int无论如何我更喜欢-keys ...
| 归档时间: |
|
| 查看次数: |
6133 次 |
| 最近记录: |