c# - 该属性是键的一部分,因此不能修改或标记为已修改
问题描述
添加加密后,我似乎无法添加用户角色。由于我收到以下错误:
无法跟踪实体类型“UserRole”的实例,因为已经在跟踪具有相同键值 {'Username', 'Rolename'} 的另一个实例。
但是,我不确定我在哪里跟踪记录,因为我现在才创建它。为什么现在我改变了问题出现的价值观?而且我对这些表没有外键约束。反正还没有。
调用代码:
async void AddUser()
{
var userAdded = await UserService.AddUser(User, Role, Password);
if (userAdded)
{
await UserService.AddUserRole(User, Role);
UserRoles.Add(new UserRole() { Username = User, Rolename = Role });
}
User = string.Empty;
Password = string.Empty;
StateHasChanged();
}
添加用户代码:
public async Task<bool> AddUser(string username, string role, string password)
{
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(role) || string.IsNullOrEmpty(password))
return false;
var usernameEncrypt = MarelEncryption.EncryptString(username); // 4gXmaWCArsBPjeJfIyX5qg==
var user = await UserRepository.FirstOrDefaultAsync(x => x.Username == usernameEncrypt);
if (user == null)
{
var passwordEncrypt = MarelEncryption.EncryptString(password); // 4gXmaWCArsBPjeJfIyX5qg==
await UserRepository.CreateAsync(new Users() { Password = passwordEncrypt, Username = usernameEncrypt });
return true;
}
else
{
return false;
}
}
添加用户角色:
public async Task<bool> AddUserRole(string username, string role)
{
var userrole = await UserRolesrepository.FirstOrDefaultAsync(x => x.Username == username && x.Rolename == role);
if (userrole == null)
{
var userEncrypt = MarelEncryption.EncryptString(username); // 3qsWsTYQYtIDKxk5rLCb5w==
var roleEncrypt = MarelEncryption.EncryptString(role); // PmWB4sczzBA5jGY2MePNdg==
await UserRolesrepository.CreateAsync(new UserRole() { Username = userEncrypt, Rolename = roleEncrypt }); // <--- ERROR
}
return true;
}
附加信息
下面我有流畅的 API 代码
/* UserRoles */
modelBuilder.Entity<UserRole>(entity =>
{
entity.HasKey(e => new { e.Username, e.Rolename });
});
解决方案
我当然无法对此进行测试,但从查看代码来看,这是我最好的猜测。
当您检查现有用户时,您正在使用用户名的加密版本来检查它是否已经存在:
var usernameEncrypt = MarelEncryption.EncryptString(username); // 4gXmaWCArsBPjeJfIyX5qg==
var user = await UserRepository.FirstOrDefaultAsync(x => x.Username == usernameEncrypt);
但是,当您检查用户角色时,您是在检查后进行加密,所以我的猜测是它将始终返回 `null,然后您将保存加密的角色:
var userrole = await UserRolesrepository.FirstOrDefaultAsync(x => x.Username == username && x.Rolename == role);
if (userrole == null) //im guessing this is always true
{
var userEncrypt = MarelEncryption.EncryptString(username); // 3qsWsTYQYtIDKxk5rLCb5w==
var roleEncrypt = MarelEncryption.EncryptString(role); // PmWB4sczzBA5jGY2MePNdg==
await UserRolesrepository.CreateAsync(new UserRole() { Username = userEncrypt, Rolename = roleEncrypt }); // <--- ERROR
}
我会在检查之前移动加密,就像您为用户所做的那样:
var userEncrypt = MarelEncryption.EncryptString(username); // 3qsWsTYQYtIDKxk5rLCb5w==
var roleEncrypt = MarelEncryption.EncryptString(role); // PmWB4sczzBA5jGY2MePNdg==
var userrole = await UserRolesrepository.FirstOrDefaultAsync(x => x.Username == userEncrypt && x.Rolename == roleEncrypt);
if (userrole == null)
{
await UserRolesrepository.CreateAsync(new UserRole() { Username = userEncrypt, Rolename = roleEncrypt }); // <--- ERROR
}
推荐阅读
- c++ - 在 Qt 中将 QStringList 项目添加到 QComboBox 时遇到问题
- python - 如何使用熊猫隔离每个多索引的第一个值?
- spring - Spock 测试在 Mocking RestTemplate 时得到 NoClassDefFoundError: net/bytebuddy/TypeCache
- python - 在使用 python 调用系统命令时使用双引号和单引号
- vue.js - 具有多个无序可选参数的 Vue2 路由器
- r - R Shiny - 如果两个输入具有相同的值,如何显示反馈消息(使用 shinyFeedback)
- wpf - 我从 MainWindowViewModel 启动了一个包含 UserControl 的窗口,我想关闭该窗口
- javascript - 调试 NodeJS 子进程的 VSCode babel-node
- sql - 获取每个 ID 的最高和第二高值 (SQL)
- ios - Xcode 10 错误:生成 NSManagedObject 子类后产生多个命令