当我需要在LinQ C#.Net Framework中更新记录时,如何验证所有字段



我正在使用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场景并不是性能的最佳方案。这里有两个数据库往返,必须在事务中明确地涵盖它们:FindAsyncSaveChanges

并非如此"可爱的";但有效的是使用分离实体:

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;
}

最新更新