У нас есть эти объекты: < /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
Мне нужно гарантировать заказа по удалению. Я пытаюсь сделать это с помощью 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);
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... der-manual