我用asp为学生完成了一个CRUD操作,然后我向学生实体添加了一个用户实体。在我添加它之后,我不得不在代码中添加一些行才能工作,但现在我被困在更新中。当我更新一个学生时,它会抛出一个错误。
以下是我的更新方法:
public async Task<Result<Unit>> Handle(Command request, CancellationToken cancellationToken)
{
var student = await _context.Students.FindAsync(request.Student.Id);
if (student == null) return null;
_mapper.Map(request.Student, student);
var result = await _context.SaveChangesAsync() > 0;
if (!result) return Result<Unit>.Failure("Failed to update student");
return Result<Unit>.Success(Unit.Value);
}
该错误在SaveChangesAsync行抛出,由于某种原因,学生表中的实体AppUser是导致错误的原因,因为它与非用户的学生一起工作得很好(当AppUser为空时)。这是抛出的错误:
失败:Microsoft.EntityFrameworkCore.Database.Command[20102]
无法执行DbCommand(5ms)[参数=[@P0=‘?’(大小=36),u/p1=‘?’(DbType=Int32),u/p2=‘?’,u/p3=‘?’(大小=36),u/p4=‘?’(大小=4),u/p5=‘?’(大小=14),u/p6=‘?’(DbType=布尔值),u/p7=‘?’(DbType=布尔型),u/p8=‘?’(DbType=布尔值),u/p9=‘?’(DbType=DateTimeOffset),u/p10=‘?’(大小=14),u/p11=‘?’(大小=14),u/p12=‘?’(尺寸=84),u/p13=‘?’,u/p14=‘?’(DbType=布尔型),u/p15=‘?’(大小=32),u/p16=‘?’(DbType=布尔值),u/p17=‘?’(Size=14)],CommandType=‘Text’,CommandTimeout=‘30’]
插入“AspNetUser”(“ID”,“AccessFailedCount”,“Bio”,“ConcurencyStamp”,“DisplayName”,“Email”,“EmailConfirmed”,“IsConfirmed”,“LockoutEnabled”,“LockoutEnd”,“Normal izedEmail”,“Normal izedUserName”,“PasswordHash”,“PhoneNumber”,“PhoneNumberConfimed”,“SecurityStamp”,“TwoFactorEnabled”,“Username”)
值(@p0、u/p1、u/p2、u/p3、u/p4、u/p5、u/p6、u/p7、u/p8、u/p9、u/p10、u/p11、u/p12、u/p13、u/p14、u/p15、u/p16、u/p17);
失败:Microsoft.EntiyFrameworkCore.Update[10000]
保存对上下文类型‘Persistence.DataContext’的更改时,数据库中出现异常。
Microsoft.EntityFrameworkCore.DbUpdateException:保存实体更改时出错。有关详细信息,请参阅内部异常。
->Microsoft.Data.Sqlite.SqliteException(0x80004005):SQLite错误19:‘唯一约束失败:AspNetUsers.NormalizedUserName’。
在Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 RC,Sqlite3 db)
在Microsoft.Data.Sqlite.SqliteDataReader.NextResult()
At Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior Behavior)
在Microsoft.Data.Sqlite.SqliteCommand.ExecuteReaderAsync(CommandBehavior行为中,取消令牌取消令牌)
在Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReaderAsync(CommandBehavior行为中,取消令牌取消令牌)
在Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject参数对象,取消令牌取消令牌)
在Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject参数对象,取消令牌取消令牌)
在Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection连接处,取消令牌取消令牌)
-内部异常堆栈跟踪结束
这个错误发生在AppUsers表的NormizedUsername列上,但我不知道为什么当我在代码中的任何地方都不使用该列时,NormizedUsername上会有一个约束。会不会是因为我把电子邮件保存为用户名,也许“@gmail.com”就是原因?
这是我的学生:
public class Student
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public bool IsConfirmed { get; set; }
public string AppUserId { get; set; }
public AppUser AppUser { get; set; }
}
这是我的AppUser:
public class AppUser : IdentityUser
{
public string DisplayName { get; set; }
public string Bio { get; set; }
public bool IsConfirmed { get; set; }
}
1条答案
按热度按时间dgtucam11#
我解决了这个问题。
错误出在更新方法上,这是我在修复错误之前的方法:
现在就是这样:
我没有将AppUser包括在学生变量中,当我将该学生Map到请求的用户时,它抛出了一个错误,因为它不包含AppUser。当我也包括AppUser时,现在SaveChangesAsync也在保存AppUser,目前一切正常。