一条数据Model更新之前肯定先要取出,然后改为Poco传到前端进行修改,修改后传回来转为Model进行保存,问题在于,转为的Model不能是new出来的,否则Context跟踪会出现错误,就像以下的做法是错误的:
namespace MyApp.Models
{
public class AppUser
{
public string Id { get; set; }
public string Name { get; set; }
}
}
namespace MyApp.Pocos
{
using MyApp.Models;
public class EditUser
{
public EditUser(AppUser appUser)//数据库提取Model后改为Poco传到前端进行修改
{
Id = appUser.Id;
Name = appUser.Name;
}
public string Id { get; set; }
public string Name { get; set; }
public AppUser GetAppUser() //修改后用这个new出来的Model进行保存,会引发错误!
{
return new AppUser
{
Id = Id,
Name = Name,
};
}
}
}
因为AppUser的Id是主键,不可修改,否则就是新数据,不能有主键等于什么的语句出现,即其中的“Id = Id”赋值语句不应出现,而不是通常以为的给用户修改的也只是Name,Id的值用户也看不到,不可能改变,没有修改。
所以正确的做法是:要么直接传Model到前端进行修改,然后进行保存,因为这里不会出现Id的赋值语句;要么Poco传回来后,先要用Poco的Id值来重新从数据库获取Model,然后传递新值进行保存,就像这样:
public async Task<IdentityResult> UpdateAppUserAsync(EditUser editUser)
{
//不能这样
// var user = editUser.GetAppUser();这是用于AddAppUserAsync(EditUser editUser)的添加新数据的
var user = _context.AppUsers.FirstOrDefault(u => u.Id == editUser.Id);//重新获取Model数据
if (user == null)
{
return IdentityResult.Failed(new IdentityError { Code = "UserNotFound", Description = "该用户数据库中未找到,可能已被删除!" });
}
if (user.Name != editUser.Name)
{
user.Name = editUser.Name;
_context.Entry(user).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
return IdentityResult.Success;
}
catch (DbUpdateException e)
{
return IdentityResult.Failed(new IdentityError { Code = "UpdateAppUserErr", Description = "保存发生错误!" + e.Message });
}
}
return IdentityResult.Failed(new IdentityError { Code = "NotEdit", Description = "用户未作修改!" });
}