Обновите новый объект перед фиксацией с помощью _unitOfWorkManager

#c# #entity-framework #unit-of-work #aspnetboilerplate #change-tracking

#c# #entity-framework #единица работы #aspnetboilerplate #отслеживание изменений

Вопрос:

В рамках моего сервиса ( class MyService : AbpServiceBase ) я пытаюсь выполнить следующее:

  • Вставьте объект в SQL и извлеките идентификатор
  • Выполните вызов REST для внешней системы и извлеките этот SystemID
  • Обновите поле в исходном объекте с помощью SystemID

Ошибка, которую я получаю:

Ожидалось, что операция базы данных повлияет на 1 строку (ы), но фактически повлияла на 0 строк (ов)

 [UnitOfWork(isTransactional: false)]
public async Task<Guid> CreateAsync(InfoDto myInfo)
{
    int? tenantId = _unitOfWorkManager.Current.GetTenantId();
    objInfo = await _infoRepository.InsertAsync(myInfo);
    newObjId = CreateNewIdentifier(tenantId);

    objInfo.ExternalIdentifier = newObjId;
    await _infoRepository.UpdateAsync(objInfo);
    return objInfo.Id;
}
  

Ответ №1:

Вам не нужно UpdateAsync . objInfo уже отслеживается.

 [UnitOfWork(isTransactional: false)]
public async Task<Guid> CreateAsync(InfoDto myInfo)
{
    int? tenantId = _unitOfWorkManager.Current.GetTenantId();
    objInfo = await _infoRepository.InsertAsync(myInfo);
    newObjId = CreateNewIdentifier(tenantId);

    objInfo.ExternalIdentifier = newObjId;
    // await _infoRepository.UpdateAsync(objInfo); // Remove this
    return objInfo.Id;
}
  

Ответ №2:

Это всегда так просто, как только вы знаете ответ… Все, что требовалось, — это аннотация. Надеюсь, что другие тоже извлекут выгоду из этого.

[UnitOfWork(isDisabled = true)]