UserManager.CreateAsync不生成Id

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没有填充,我也遇到了类似的错误.

Chr*_*Fin 6

我发现这个问题:
因为我改变从键stringint以下迁移创建:

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 ...