實體框架核心 - REST json合併補丁(部分更新)

c# entity-framework entity-framework-core rest

EF Core支持Json Patch - RFC6902

https://github.com/aspnet/JsonPatch

我想在我的應用程序 - RFC7396中添加對Json Merge Patch的支持

我是實體框架的新手。

我嘗試了以下,它工作正常,但想知道實現是否正常(模型驗證是在過濾器中處理,所以請忽略該部分):

[HttpPatch("{id}")]
public async Task<IActionResult> Update(int id, [FromBody] TEntity updatedEntity)
{
    TEntity entity = repository.GetById<TEntity>(id);
    if (entity == null)
    {
         return NotFound(new { message = $"{EntityName} does not exist!" });
    }
    repository.Update(entity, updatedEntity);
    await repository.SaveAsync();
    return NoContent();
}

在存儲庫中:

public void Update<TEntity>(TEntity entity, TEntity updatedEntity) where TEntity : class, IEntity
{
    updatedEntity.Id = entity.Id;
    PropertyInfo[] properties = entity.GetType().GetProperties();
    foreach (PropertyInfo propertyInfo in properties)
    {
        if (propertyInfo.GetValue(updatedEntity, null) != null)
        {
            propertyInfo.SetValue(entity, propertyInfo.GetValue(updatedEntity, null), null);
        }
    }
    entity.ModifiedDate = DateTime.UtcNow;
    context.Entry(entity).Property(e => e.CreatedDate).IsModified = false;
}

熱門答案

使用實體類型是一種糟糕的模式,它反映了外部接口(您的api)中的內部模式(您的數據庫)。

但是對於部分更新,您可以像這樣使用動態:

dynamic changedData = new { /* props you wanna change */ };
DataContext.Entry(yourEntity).CurrentValues.SetValues(changedData);


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow