A session and state implementation example.

Demonstration — Adding a Shopping Cart

Create the shopping cart item model:
/Models/ShoppingCartItem.cs

public class ShoppingCartItem
{
    public int ShoppingCartItemId { get; set; }
    public Pie Pie { get; set; } = default!; // the Pie added to the cart
    public int Amount { get; set; } // the cost of the Pie
    public string? ShoppingCartId { get; set; } // a GUID
}

Create a DbSet for the ShoppingCartItems:
/Models/BethanysPieShopDbContext.cs

// …
    public DbSet<ShoppingCartItem> ShoppingCartItems { get; set; }
// …

Update the Database

pm> add-migration ShoppingCartItem
pm> update-database

Create an interface for the shopping cart:
/Models/IShoppingCart.cs

public interface IShoppingCart
{
    List<ShoppingCartItem> ShoppingCartItems { get; set; }

    void AddToCart(Pie pie);
    int RemoveFromCart(Pie pie);
    List<ShoppingCartItem> GetShoppingCartItems();
    void ClearCart();
    decimal GetShoppingCartTotal();
}

Create the shopping cart model:
/Models/ShoppingCart.cs

// …

Update DI:
Program.cs

builder.Services.AddSession();
builder.Services.AddHttpContextAccessor();

builder.Services.AddScoped<IShoppingCart, ShoppingCart>(ShoppingCart.GetCart);

app.UseSession();

Add a shopping cart controller:
Controllers/ShoppingCartController.cs

public class ShoppingCartController : Controller
{
    private readonly IPieRepository _pieRepository;
    private readonly IShoppingCart _shoppingCart;

    public ShoppingCartController(IPieRepository pieRepository, IShoppingCart shoppingCart)
    {
        _pieRepository = pieRepository;
        _shoppingCart = shoppingCart;
    }

    
    public ViewResult Index()
    {
        var items = _shoppingCart.GetShoppingCartItems();
        _shoppingCart.ShoppingCartItems = items;

        var shoppingCartViewModel = new ShoppingCartViewModel(_shoppingCart, _shoppingCart.GetShoppingCartTotal());

        return View(shoppingCartViewModel);
    }

    public RedirectToActionResult AddToShoppingCart(int pieId)
    {
        var selectedPie = _pieRepository.AllPies.FirstOrDefault(p => p.PieId == pieId);

        if (selectedPie is not null)
            _shoppingCart.AddToCart(selectedPie);

        return RedirectToAction("Index"); // redirect to index of shopping cart
    }

    public RedirectToActionResult RemoveFromShoppingCart(int pieId)
    {
        var selectedPie = _pieRepository.AllPies.FirstOrDefault(p => p.PieId == pieId);

        if (selectedPie is not null)
            _shoppingCart.RemoveFromCart(selectedPie);

        return RedirectToAction("Index");
    }
}

Add a shopping cart viewmodel:
/ViewModels/ShoppingCartViewModel.cs

public class ShoppingCartViewModel
{
    public IShoppingCart ShoppingCart { get; set; }
    public decimal ShoppingCartTotal { get; }

    public ShoppingCartViewModel(IShoppingCart shoppingCart, decimal shoppingCartTotal)
    {
        ShoppingCart = shoppingCart;
        ShoppingCartTotal = shoppingCartTotal;
    }
}

Add a shopping cart view (index page):
/Views/ShoppingCart/index.cshtml

@model ShoppingCartViewModel

<h3 class="my-5">
    Shopping cart
</h3>


<div class="row gx-3">
    <div class="col-8">
        @foreach (var line in Model.ShoppingCart.ShoppingCartItems)
        {
            <div class="card shopping-cart-card mb-2">
                <div class="row">
                    <div class="col-md-4">
                        <img src="@line.Pie.ImageThumbnailUrl" class="img-fluid rounded-start p-2" alt="@line.Pie.Name">
                    </div>
                    <div class="col-md-8">
                        <div class="card-body">
                            <h5 class="card-text">@line.Amount x @line.Pie.Name</h5>
                            <div class="d-flex justify-content-between">
                                <h6>@line.Pie.ShortDescription</h6>
                                <h2>@line.Pie.Price.ToString("c")</h2>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        }
    </div>
    <div class="col-4">
        <div class="card shopping-cart-card p-3">
            <div class="row">
                <h4 class="col">Total:</h4>
                <h4 class="col text-end">@Model.ShoppingCartTotal.ToString("c")</h4>
            </div>
            <hr />
            <div class="text-center d-grid">
            </div>
        </div>
    </div>
</div>