将声明添加到ASP.Net Identity Core用户失败,出现EF插入错误

时间:2018-03-06 22:07:20

标签: asp.net-core .net-core asp.net-identity identity claims-based-identity

我在.Net Core上使用ASP.Net Core,版本:

> dotnet --info
.NET Command Line Tools (2.1.4)

Product Information:
 Version:            2.1.4
 Commit SHA-1 hash:  5e8add2190

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.16299
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.1.4\

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.5
  Build    : 17373eb129b3b05aa18ece963f8795d65ef8ea54

我正在尝试使用以下方式添加具有声明的新用户:

var r = await _userManager.CreateAsync(new ApplicationUser { UserName = "example", Email = "example@example.com" }, "password");
var u = await userManager.FindByEmailAsync("example@example.com");

if(u == null) {
    throw new Exception("User was not found");
}

await _userManager.AddClaimAsync(u, new Claim("FullName", "Example McExample"));

我使用MS SQL作为后备存储,使用命令:

创建由Entity Framework创建的模式
dotnet ef database update

用户是在数据库中创建的,但声明创建失败并显示错误:

  

Microsoft.EntityFrameworkCore.DbUpdateException:发生错误   在更新条目时。有关详细信息,请参阅内部异常--->

     

System.Data.SqlClient.SqlException:无法将值NULL插入   栏' Id',table' IdentityDemoDatabase.dbo.AspNetUserClaims&#39 ;;专栏   不允许空值。 INSERT失败。

     

声明已经终止。

当单步执行代码时,会成功创建用户,然后成功检索用户(用户返回的用户与刚刚添加的用户匹配),然后AddClaimAsync()方法因上述错误而失败。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

事实证明,我使用了错误的EF迁移。

EF使用您在Startup类中配置的数据库上下文,并且它生成的迁移非常特定于在那里配置的提供程序。

我正在使用从dotnet new --auth individual模板复制的迁移,但这些迁移是为Sqlite而不是我使用的MS SQL Server构建的。

要生成自己的迁移,请删除现有迁移,然后将Startup配置为使用您想要的提供程序:

// Add a store context for ASP.Net Identity 2 to use
services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));

然后将EF工具(如果它已经存在于您的项目中)添加到csproj

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" />

然后运行:

dotnet restore
dotnet ef migrations add InitialCreate
dotnet ef database update

EF将运行您的Startup,获取提供程序和上下文,然后在数据库中创建表。