我正在尝试将数据植入数据库。它在。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(" ", "_");
删除它们,它将按预期工作。