我正在尝试为我的应用程序中的所有实体完成一个常规存储库。我有一个BaseEntity
,其属性为Id
,CreatorId
和LastModifiedUserId
。现在,我想更新集合中的一条记录,而不必修改字段CreatorId
,因此(从客户端)我有一个实体,其中有一些我想更新的已更新字段。
嗨,有2种方法:
回购协议是这样创建的:
public class BaseRepository<T> : IRepository<T> where T : BaseEntity
{
public async Task<T> Replace/Update(T entity){...}
}
因此使用Update(1)非常困难,因为我应该反射性地检索T的所有字段,并排除那些我不想更新的字段。
使用Replace(2),我无法找到一种方法来指定在用另一个对象替换对象时应排除哪些字段。 Projection
中的FindOneAndReplaceOptions<T>()
属性仅排除更新后返回的文档上的字段。
我是否错过了replace
方法中排除字段的方法,还是应该尝试通过反射检索字段并使用Update
?
答案 0 :(得分:0)
我不知道此解决方案对您来说还行..我要做的是:
在基本仓库中声明类似的方法
public virtual bool Update(TEntity entity, string key)
{
var result = _collection.ReplaceOne(x => x.Id.Equals(key), entity, new UpdateOptions
{
IsUpsert = false
});
return result.IsAcknowledged;
}
然后,当您想要更新实体时,就在控制器中,在那里您可以设置要更改的道具..如:
[HttpPut]
[ProducesResponseType(typeof(OrderDTO), 200)]
[ProducesResponseType(400)]
public async Task<ActionResult<bool>> Put([FromBody] OrderDTO value)
{
try
{
if (!ModelState.IsValid) return BadRequest(ModelState);
var orderOnDb = await _orderService.FindAsync(xx => xx.Id == value.Id);
if (orderOnDb == null) return BadRequest(Constants.Error.NOT_FOUND_ON_MONGO);
// SET PROPERTY TO UPDATE (MANUALLY)
orderOnDb.LastUpdateDate = DateTime.Now;
orderOnDb.PaymentMethod = value.PaymentMethod;
orderOnDb.StateHistory = value.StateHistory;
//Save on db
var res = await _orderRepo.UpdateAsync(orderOnDb, orderOnDb.Id);
return res;
}
catch (Exception ex)
{
_logger.LogCritical(ex, ex.Message);
throw ex;
}
}
希望对您有帮助!