Caching lookup values in an e-commerce website
Global static state makes your code untestable...

I would define your car make lookup as:

public class CarMakeLookup
{
    public CarMakeLookup(IEnumerable&lt;(short Id, string Make)&gt; data)
    {
        Makes = data.ToDictionary(d =&gt; d.Id, d =&gt; d.Make);
        Ids = data.ToDictionary(d =&gt; d.Make, d =&gt; d.Id);
    }

    public IReadOnlyDictionary&lt;short, string&gt; Makes { get; }
    public IReadOnlyDictionary&lt;string, short&gt; Ids { get; }
}


And read it with:

public class CarMakeReader : IReader&lt;CarMakeLookup&gt;
{
    public CarMakeReader(Func&lt;ApplicationDbContext&gt; context) =&gt; 
        Context = context;

    Func&lt;DbContext&gt; Context { get; }

    public Task&lt;CarMakeLookup&gt; ReadAsync()
    {
        using (var context = Context())
            return new CarMakeLookup(
                from cm in context.CarMakes
                select (cm.CarMakeId, cm.CarMakeName));            
    }
}


Where IReader&lt;&gt; is simply:

public interface IReader&lt;TSet&gt;
{
    Task&lt;TSet&gt; ReadAsync();
}


There should be also an extension method Cache defined nearby:

public static class Reader
{
    public static IReader&lt;TSet&gt; Cache&lt;TSet&gt;(this IReader&lt;TSet&gt; source) =&gt;
        new CachingReader&lt;TSet&gt;(source);
}


Where:

class CachingReader&lt;TSet&gt; : IReader&lt;TSet&gt;
{
    public CachingReader(IReader&lt;TSet&gt; source) =&gt; 
        Lookup = new Lazy&lt;Task&lt;TSet&gt;&gt;(() =&gt; source.ReadAsync());

    Lazy&lt;Task&lt;TSet&gt;&gt; Lookup { get; }
    public Task&lt;TSet&gt; ReadAsync() =&gt; Lookup.Value;
}


Now register you reader in the IoC container as a decorated singleton:

containerBuilder.RegisterInstance(ctx =&gt; new CarMakeLookup(
    ctx.Resolve&lt;Func&lt;ApplicationDbContext&gt;&gt;())
    .Cache()).AsImplementedInterfaces();