NET Core MongoDb Обновление / замена исключить поля - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь заполнить общий репозиторий для всех сущностей в моем приложении.У меня есть BaseEntity со свойством Id, CreatorId и LastModifiedUserId.Теперь я хотел бы обновить запись в коллекции, не изменяя поле CreatorId, поэтому у меня (от клиента) сущность оценена с некоторыми полями, которые я хочу обновить.Привет, есть 2 способа:

  1. UpdateOneAsync
  2. ReplaceOneAsync

Репо создается так:

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?

1 Ответ

0 голосов
/ 09 февраля 2019

Я не знаю, подходит ли вам это решение .. что я делаю:

Объявите в Base Repo метод, подобный

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

Надеюсь, это поможет вам !!!

...