Должны ли мы вызывать SaveChanges перед фиксацией транзакции для чтения промежуточного результата?C#

Место общения программистов C#
Ответить
Anonymous
 Должны ли мы вызывать SaveChanges перед фиксацией транзакции для чтения промежуточного результата?

Сообщение Anonymous »

Я написал такой метод:

Код: Выделить всё

try
{
_unitOfWork.BeginTransaction();

response = _unitOfWork.DeclarationRepository.ChangeDeclarationSectionFormsState_1Async(declarationId,sectionId, newFormState);

// we need this save changes here so that the intermediate result
// is available for UpdateDeclarationStatusIfApplicableAsync to read the
// statuses of the forms even if they are not yet committed to the db
await _unitOfWork.SaveChangesAsync(cancellationToken);

//throw new Exception();

DeclarationStatusTypes newDeclarationStatus = Mappers.FormStateToDeclarationStatusMapper[newFormState];
await _unitOfWork.DeclarationRepository.UpdateDeclarationStatusIfApplicableAsync(declarationId, newDeclarationStatus, cancellationToken);

await _unitOfWork.CommitAsync(cancellationToken);
}
catch
{
_unitOfWork.Rollback();

throw;
}
Я вызываю SaveChanges между ними, чтобы следующий метод UpdateDeclarationStatusIfApplicableAsync мог прочитать результат с промежуточными изменениями.
Метод пытается прочитать промежуточные записи следующим образом:

Код: Выделить всё

StringBuilder query = new StringBuilder("SELECT CAST(CASE WHEN EXISTS (");

foreach (string formTable in FormDbTableMapper.Values)
{
query.AppendLine($"SELECT 1 AS [Value] FROM {Constants.Schema.DEC}.{formTable} WHERE DeclarationId=@DeclarationId AND IsActive=1 AND State@State");
query.AppendLine(" UNION ");
}

// remove the last UNION
query.Length -= 8;

query.AppendLine(") THEN 0 ELSE 1 END AS BIT) AS [Value]");

SqlParameter declarationIdParam = new SqlParameter("DeclarationId",declarationId);
SqlParameter stateParam = new SqlParameter("State", (int)state);
return await dbContext.Database.SqlQueryRaw(query.ToString(), new[] { declarationIdParam, stateParam }).FirstOrDefaultAsync();
Транзакция полностью откатывается, если возникает исключение - также происходит все или ничего, что и является моим требованием. Все работает отлично.
Мой вопрос: является ли создание таких точек сохранения перед фиксацией транзакции антипаттерном или неправильно?

Подробнее здесь: https://stackoverflow.com/questions/798 ... iate-resul
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»