我正在使用C#.NET Framework,我需要知道如何验证所有需要更新的字段,例如,我有一个包含四个字段的表,所以,如果用户只需要更改一个字段,我如何只更新该字段,实际上我有这样的代码:
public async Task<ServiceResponse<User>> UpdateUser(User newUserUpdate)
{
ServiceResponse<User> serviceResponse = new();
//Este llamada es para buscar por medio del ID ingresado por el usuario
User userFinded = await _dataContext.Users.FindAsync(newUserUpdate.Id);
//¿Como iterar para validar que campos actualizar?
if (newUserUpdate.userName != null) userFinded.userName = newUserUpdate.userName;
if (newUserUpdate.email != null) userFinded.email = newUserUpdate.email;
if (newUserUpdate.password != null) userFinded.password = newUserUpdate.password;
_dataContext.Users.Update(userFinded);
_dataContext.SaveChanges();
serviceResponse.Message = "Usuario Actualizado Exitosamente";
return serviceResponse;
}
我正在使用IF语句来验证和更新新值,但我认为这不是一个好的做法。也许是lambda表达式?
您不需要显式调用_dataContext.Users.Update(userFinded);
。EF将自动检测对象的变化,并只更新所需的字段。因此,只需为DbContext调用SaveChanges
,ChangeTracker就会发现哪些属性发生了更改。
从另一方面来看,EF的CRUD场景并不是性能的最佳方案。这里有两个数据库往返,必须在事务中明确地涵盖它们:FindAsync
和SaveChanges
。
并非如此"可爱的";但有效的是使用分离实体:
public async Task<ServiceResponse<User>> UpdateUser(User newUserUpdate)
{
ServiceResponse<User> serviceResponse = new();
if (newUserUpdate.userName != null) ||
newUserUpdate.email != null) ||
newUserUpdate.password != null)
{
_dataContext.Users.Attach(newUserUpdate);
var entry = _dataContext.Entry(newUserUpdate);
if (newUserUpdate.userName != null) entry.Property(x => x.userName).IsModified = true;
if (newUserUpdate.email != null) entry.Property(x => x.email).IsModified = true;
if (newUserUpdate.password != null) entry.Property(x => x.password).IsModified = true;
await _dataContext.SaveChangesAync();
}
serviceResponse.Message = "Usuario Actualizado Exitosamente";
return serviceResponse;
}