EF Core -尝试保存更改种子数据时,x的值是未知的



我正在尝试将数据植入数据库。它在。net 5上运行正常

模型配置

builder.Entity<User>()
.HasMany(ur => ur.UserRoles)
.WithOne(u => u.User)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
builder.Entity<Role>()
.HasMany(ur => ur.UserRoles)
.WithOne(u => u.Role)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();

现在在。net 6中,当我尝试运行播种/添加数据到数据库时,这是错误消息。

Error] An exception occurred in the database while saving changes for context type '"API.Data.DataContext"'."n""System.InvalidOperationException: The value of 'UserRole.UserId' is unknown when attempting to save changes. This is because the property is also part of a foreign key for which the principal entity in the relationship is not known.n   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.PrepareToSave()n   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.GetEntriesToSave(Boolean cascadeChanges)n   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(StateManager stateManager, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)n   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)n   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)"

我的播种数据函数;

private void AddUsers()
{
Task.Run(async () =>
{
string? path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!_context.Users.Any())
{
var userData = File.ReadAllText(path + @"/Data/SeedData/users.json");
var users = JsonSerializer.Deserialize<List<User>>(userData);
if (users == null) return;
foreach (var user in users)
{
user.UserName = user.UserName.ToLower();
user.EmailConfirmed = true;
user.PhoneNumberConfirmed = true;
user.IsActive = true;
// ***this below createAsync is producing error.***
await _userManager.CreateAsync(user, Users.DefaultPassword);
await _userManager.AddToRoleAsync(user, Roles.BasicUser);
}

_logger.LogInformation(_localizer["Seeded Users."]);
}
}).GetAwaiter().GetResult();
}

我已经克隆了您的存储库,并通过将_userManager.CreateAsync分配给一个变量来跟踪问题。

var result = await _userManager.CreateAsync(user, Users.DefaultPassword);
await _userManager.AddToRoleAsync(user, Roles.BasicUser);

现在,如果您调试程序并检查result,您将看到操作已经失败。

Failed: Invalid Username
Username 'cobb walters' is invalid, can only contain letters or digits.

这是由种子数据中的空格引起的。您的用户名不能包含Microsoft Identity中的空格。手动或简单地通过user.UserName = user.UserName.Replace(" ", "_");删除它们,它将按预期工作。

最新更新