Должен ли я использовать Savechangs внутри транзакции, чтобы гарантировать удаление порядка (ручное удаление каскада)?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Должен ли я использовать Savechangs внутри транзакции, чтобы гарантировать удаление порядка (ручное удаление каскада)?

Сообщение Anonymous »

Мы используем структуру Entity Framework Core 8 с базой данных PostgreSQL. < /p>
У нас есть эти объекты: < /p>

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

public class PolicyDraft : BaseEntity
{
public Guid PolicyId { get; set; }

public List Proposals { get; set; };
public List PaymentLinks { get; set; };
// ...
}

public class Proposal : BaseEntity
{
public Guid ProposalId { get; set; }
public PolicyDraft PolicyDraft { get; set; }
// ...
}

public class PaymentLink : BaseEntity
{
public string Link { get; set; }
public PolicyDraft PolicyDraft { get; set; }
// ...
}
< /code>
Cascade Delete не был установлен в базе данных, и я не могу установить его по некоторым причинам. Мне нужно получить все PolicyDrafts 
и связанные с ними предложения и платежные линии . Далее я должен удалить предложения и платежные линии , а затем PolicyDrafts .
Мне нужно гарантировать заказа по удалению. Я пытаюсь сделать это с помощью SaveChangesAsync дважды: после удаления обоих предложений и платежных лимков , а затем снова после удаления PolicyDrafts . Также я делаю это в транзакции.

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

public async Task RemoveOld(DateTime cleanupBeforeDate, int fetchLimit, CancellationToken cancellationToken)
{
await using var context = await _dbContextFactory.CreateDbContextAsync(cancellationToken);

List
 oldData =
await context
.Query(EntityDeleteState.All, asNoTracking: true)
.Where(x => x.CreateDate  new PolicyDraftIdAndRelatedEntitiesIdsDto
{
PolicyDraftId = x.Id,
ProposalsIds = x.Proposals.Select(pr => pr.Id).ToList(),
PaymentLinksIds = x.PaymentLinks.Select(pa => pa.Id).ToList(),
})
.ToListAsync(cancellationToken);

if (oldData.Count == 0)
{
return new(0, 0, 0);
}

List policyDrafts = oldData
.Select(pd => pd.PolicyDraftId)
.Select(id => new PolicyDraft { Id = id })
.ToList();
int removedPolicyDraftsCount = policyDrafts.Count;

List proposals = oldData
.SelectMany(pr => pr.ProposalsIds)
.Select(id => new Proposal { Id = id })
.ToList();
int removedProposalsCount = proposals.Count;

List paymentLinks = oldData
.SelectMany(pl => pl.PaymentLinksIds)
.Select(id => new PaymentLink { Id = id })
.ToList();
int removedPaymentLinksCount = paymentLinks.Count;

await using var transaction = await context.Database.BeginTransactionAsync(cancellationToken);

try
{
context.RemoveRange(proposals);
context.RemoveRange(paymentLinks);
await context.SaveChangesAsync(cancellationToken); // to be shure policyDrafts will be removed after proposals and paymentLinks
context.RemoveRange(policyDrafts);
await context.SaveChangesAsync(cancellationToken);
await transaction.CommitAsync(cancellationToken);
}
catch
{
await transaction.RollbackAsync(cancellationToken);
throw;
}

return new(removedPolicyDraftsCount, removedProposalsCount, removedPaymentLinksCount);
}
Должен ли я использовать Savechangesasync дважды, чтобы гарантировать порядок удаления?


Подробнее здесь: https://stackoverflow.com/questions/796 ... der-manual
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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