将声明添加到 ASP.Net 标识核心用户失败,并显示 EF 插入错误



我在.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 Filesdotnetsdk2.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 作为后备存储,实体框架使用以下命令创建的架构:

dotnet ef database update

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

Microsoft.实体框架核心.数据库更新异常: 发生错误 在更新条目时。有关详细信息,请参阅内部异常。--->

System.Data.SqlClient.SqlException:无法将值 NULL 插入 列 'Id', 表 'IdentityDemoDatabase.dbo.AspNetUserClaims';列执行 不允许空值。插入失败。

该语句已终止。

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

我做错了什么?

事实证明,我使用了错误的 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,获取提供程序和上下文,然后在数据库中创建表。

删除现有迁移

dotnet ef database update 0

dotnet ef migrations remove

相关内容

最新更新