public async Task UpdateItemAsync(InventoryItem item, InventoryItemChange change, InventoryItemSnapshot snapshot, CancellationToken cancellationToken = default) { Guard.Argument(item, nameof(item)).NotNull(); Guard.Argument(change, nameof(change)).NotNull(); Guard.Argument(snapshot, nameof(snapshot)).NotNull(); var lastChange = await DbContext.InventoryItemChanges .Where(someChange => someChange.ItemId == item.Id) .OrderBy(someChange => someChange.Sequence) .LastAsync(cancellationToken).ConfigureAwait(false); var lastSnapshot = await DbContext.InventoryItemSnapshots .Where(someSnapshot => someSnapshot.ItemId == item.Id) .OrderBy(someSnapshot => someSnapshot.Sequence) .LastAsync(cancellationToken).ConfigureAwait(false); change.ItemId = item.Id; change.Sequence = lastChange.Sequence + 1; change.NewSnapshotSequence = lastSnapshot.Sequence + 1; DbContext.InventoryItemChanges.Add(change); snapshot.ItemId = item.Id; snapshot.Sequence = lastSnapshot.Sequence + 1; DbContext.InventoryItemSnapshots.Add(snapshot); await DbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); }
public async Task CreateItemAsync(InventoryItem item, InventoryItemChange change, InventoryItemSnapshot snapshot, CancellationToken cancellationToken = default) { Guard.Argument(item, nameof(item)).NotNull(); Guard.Argument(change, nameof(change)).NotNull(); Guard.Argument(snapshot, nameof(snapshot)).NotNull(); await using var transaction = await DbContext.Database.BeginTransactionAsync(cancellationToken).ConfigureAwait(false); DbContext.InventoryItems.Add(item); await DbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); change.ItemId = item.Id; change.Sequence = 1; change.NewSnapshotSequence = 1; DbContext.InventoryItemChanges.Add(change); snapshot.ItemId = item.Id; snapshot.Sequence = 1; DbContext.InventoryItemSnapshots.Add(snapshot); await DbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); await transaction.CommitAsync(cancellationToken).ConfigureAwait(false); }