public async Task HitRateBuffer()
        {
            EastFive.Persistence.Azure.StorageTables.Driver.E5CloudTable.MinimumParallelConnections         = 20;
            EastFive.Persistence.Azure.StorageTables.Driver.E5CloudTable.ConnectionCountGrowthStoppingPoint = 100;
            EastFive.Persistence.Azure.StorageTables.Driver.E5CloudTable.ConnectionCountReductionPoint      = 55;

            var modelsTraditional = await Enumerable
                                    .Range(0, 1000)
                                    .Select(n => ComplexStorageModel.Create().AsTask())
                                    .AsyncEnumerable()
                                    .Select(model => model.StorageCreateAsync(
                                                tr => tr.Entity))
                                    .Await(readAhead: 50)
                                    .ToArrayAsync();

            ComplexStorageModel[] models = await modelsTraditional
                                           .Select(model => model.StorageDeleteAsync(
                                                       () => model))
                                           .AsyncEnumerable()
                                           .ToArrayAsync();
        }
        public async Task DataStoresCorrectly()
        {
            var resource    = ComplexStorageModel.Create();
            var resourceRef = resource.resourceRef;

            Assert.IsTrue(await resource.StorageCreateAsync(
                              (resourceIdCreated) => true,
                              () =>
            {
                return(false);
            }));

            var resourceLoaded = await resourceRef.StorageGetAsync(
                rl => rl,
                () =>
            {
                Assert.Fail("Failed to load resource.");
                throw new Exception();
            });

            Assert.AreEqual(resource.id, resourceLoaded.id);
            Assert.AreEqual(resource.guid, resourceLoaded.guid);
            Assert.AreEqual(resource.objectInt, resourceLoaded.objectInt);
            Assert.AreEqual(resource.objectString, resourceLoaded.objectString);
            Assert.AreEqual(resource.stringProperty, resourceLoaded.stringProperty);

            #region Embedded object test

            Assert.AreEqual(resource.embeddedModel.guid, resourceLoaded.embeddedModel.guid);
            Assert.AreEqual(resource.embeddedModel.objectInt, resourceLoaded.embeddedModel.objectInt);
            Assert.AreEqual(resource.embeddedModel.objectString, resourceLoaded.embeddedModel.objectString);
            Assert.AreEqual(resource.embeddedModel.stringProperty, resourceLoaded.embeddedModel.stringProperty);

            Assert.AreEqual(resource.embeddedModel.relatedOptionalRef.id, resourceLoaded.embeddedModel.relatedOptionalRef.id);
            Assert.AreEqual(resource.embeddedModel.relatedRef.id, resourceLoaded.embeddedModel.relatedRef.id);

            Assert.AreEqual(resource.embeddedModel.arrayGuid[0], resourceLoaded.embeddedModel.arrayGuid[0]);
            Assert.AreEqual(resource.embeddedModel.arrayGuid[1], resourceLoaded.embeddedModel.arrayGuid[1]);
            Assert.AreEqual(resource.embeddedModel.arrayObjectInt[0], resourceLoaded.embeddedModel.arrayObjectInt[0]);
            Assert.AreEqual(resource.embeddedModel.arrayObjectInt[1], resourceLoaded.embeddedModel.arrayObjectInt[1]);
            Assert.AreEqual(resource.embeddedModel.arrayObjectString[0], resourceLoaded.embeddedModel.arrayObjectString[0]);
            Assert.AreEqual(resource.embeddedModel.arrayObjectString[1], resourceLoaded.embeddedModel.arrayObjectString[1]);
            Assert.AreEqual(resource.embeddedModel.arrayString[0], resourceLoaded.embeddedModel.arrayString[0]);
            Assert.AreEqual(resource.embeddedModel.arrayString[1], resourceLoaded.embeddedModel.arrayString[1]);
            Assert.AreEqual(resource.embeddedModel.arrayString[2], resourceLoaded.embeddedModel.arrayString[2]);
            Assert.AreEqual(resource.embeddedModel.arrayString[3], resourceLoaded.embeddedModel.arrayString[3]);
            Assert.AreEqual(resource.embeddedModel.arrayRef[0].id, resourceLoaded.embeddedModel.arrayRef[0].id);
            Assert.AreEqual(resource.embeddedModel.arrayRef[1].id, resourceLoaded.embeddedModel.arrayRef[1].id);
            Assert.AreEqual(resource.embeddedModel.arrayRefObjObj[0].id, resourceLoaded.embeddedModel.arrayRefObjObj[0].id);
            Assert.AreEqual(resource.embeddedModel.arrayRefObjObj[1].id, resourceLoaded.embeddedModel.arrayRefObjObj[1].id);
            Assert.AreEqual(resource.embeddedModel.arrayRelatedOptionalObjObjRef[0].id, resourceLoaded.embeddedModel.arrayRelatedOptionalObjObjRef[0].id);
            Assert.AreEqual(resource.embeddedModel.arrayRelatedOptionalObjObjRef[1].id, resourceLoaded.embeddedModel.arrayRelatedOptionalObjObjRef[1].id);
            Assert.AreEqual(resource.embeddedModel.arrayRelatedOptionalRef[0].id, resourceLoaded.embeddedModel.arrayRelatedOptionalRef[0].id);
            Assert.AreEqual(resource.embeddedModel.arrayRelatedOptionalRef[1].id, resourceLoaded.embeddedModel.arrayRelatedOptionalRef[1].id);

            #endregion

            Assert.AreEqual(resource.refObjObj.id, resourceLoaded.refObjObj.id);
            Assert.AreEqual(resource.relatedOptionalObjObjRef.id, resourceLoaded.relatedOptionalObjObjRef.id);
            Assert.AreEqual(resource.relatedOptionalRef.id, resourceLoaded.relatedOptionalRef.id);
            Assert.AreEqual(resource.relatedRef.id, resourceLoaded.relatedRef.id);
            Assert.AreEqual(resource.resourceRef.id, resourceLoaded.resourceRef.id);

            Assert.AreEqual(resource.arrayGuid.Length, resourceLoaded.arrayGuid.Length);
            Assert.AreEqual(resource.arrayGuid[0], resourceLoaded.arrayGuid[0]);
            Assert.AreEqual(resource.arrayGuid[1], resourceLoaded.arrayGuid[1]);

            Assert.AreEqual(resource.arrayEnum[0], resourceLoaded.arrayEnum[0]);
            Assert.AreEqual(resource.arrayEnum[1], resourceLoaded.arrayEnum[1]);
            Assert.AreEqual(resource.arrayEnum[2], resourceLoaded.arrayEnum[2]);

            Assert.AreEqual(resource.arrayObjectInt.Length, resourceLoaded.arrayObjectInt.Length);
            Assert.AreEqual(resource.arrayObjectInt[0], resourceLoaded.arrayObjectInt[0]);
            Assert.AreEqual(resource.arrayObjectInt[1], resourceLoaded.arrayObjectInt[1]);

            Assert.AreEqual(resource.arrayObjectString.Length, resourceLoaded.arrayObjectString.Length);
            Assert.AreEqual(resource.arrayObjectString[0], resourceLoaded.arrayObjectString[0]);
            Assert.AreEqual(resource.arrayObjectString[1], resourceLoaded.arrayObjectString[1]);
            Assert.AreEqual(resource.arrayObjectString[2], resourceLoaded.arrayObjectString[2]);
            Assert.AreEqual(resource.arrayObjectString[3], resourceLoaded.arrayObjectString[3]);

            Assert.AreEqual(resource.arrayRef.Length, resourceLoaded.arrayRef.Length);
            Assert.AreEqual(resource.arrayRef[0].id, resourceLoaded.arrayRef[0].id);
            Assert.AreEqual(resource.arrayRef[1].id, resourceLoaded.arrayRef[1].id);

            Assert.AreEqual(resource.arrayRefObj.Length, resourceLoaded.arrayRefObj.Length);
            Assert.AreEqual(resource.arrayRefObj[0].id, resourceLoaded.arrayRefObj[0].id);
            Assert.AreEqual(resource.arrayRefObj[1].id, resourceLoaded.arrayRefObj[1].id);

            Assert.AreEqual(resource.arrayRefObjObj.Length, resourceLoaded.arrayRefObjObj.Length);
            Assert.AreEqual(resource.arrayRefObjObj[0].id, resourceLoaded.arrayRefObjObj[0].id);
            Assert.AreEqual(resource.arrayRefObjObj[1].id, resourceLoaded.arrayRefObjObj[1].id);

            Assert.AreEqual(resource.arrayRelatedOptionalObjObjRef.Length, resourceLoaded.arrayRelatedOptionalObjObjRef.Length);
            Assert.AreEqual(resource.arrayRelatedOptionalObjObjRef[0].id, resourceLoaded.arrayRelatedOptionalObjObjRef[0].id);
            Assert.AreEqual(resource.arrayRelatedOptionalObjObjRef[1].id, resourceLoaded.arrayRelatedOptionalObjObjRef[1].id);
            Assert.AreEqual(resource.arrayRelatedOptionalObjObjRef[2].id, resourceLoaded.arrayRelatedOptionalObjObjRef[2].id);

            Assert.AreEqual(resource.arrayRelatedOptionalRef.Length, resourceLoaded.arrayRelatedOptionalRef.Length);
            Assert.AreEqual(resource.arrayRelatedOptionalRef[0].id, resourceLoaded.arrayRelatedOptionalRef[0].id);
            Assert.AreEqual(resource.arrayRelatedOptionalRef[1].id, resourceLoaded.arrayRelatedOptionalRef[1].id);
            Assert.AreEqual(resource.arrayRelatedOptionalRef[2].id, resourceLoaded.arrayRelatedOptionalRef[2].id);

            Assert.AreEqual(resource.arrayString.Length, resourceLoaded.arrayString.Length);
            Assert.AreEqual(resource.arrayString[0], resourceLoaded.arrayString[0]);
            Assert.AreEqual(resource.arrayString[1], resourceLoaded.arrayString[1]);
            Assert.AreEqual(resource.arrayString[2], resourceLoaded.arrayString[2]);
            Assert.AreEqual(resource.arrayString[3], resourceLoaded.arrayString[3]);

            // TODO: Dictionaries

            Assert.AreEqual(resource.dictGuid[resource.dictGuid.Keys.First()][0], resourceLoaded.dictGuid[resource.dictGuid.Keys.First()][0]);
            Assert.AreEqual(resource.dictGuid[resource.dictGuid.Keys.Skip(1).First()][1], resourceLoaded.dictGuid[resource.dictGuid.Keys.Skip(1).First()][1]);

            Assert.AreEqual(resource.dictObject[resource.dictObject.Keys.First()][0], resourceLoaded.dictObject[resource.dictObject.Keys.First()][0]);
            Assert.AreEqual(resource.dictObject[resource.dictObject.Keys.Skip(1).First()][1], resourceLoaded.dictObject[resource.dictObject.Keys.Skip(1).First()][1]);

            //Assert.AreEqual(resource.dictEmbeddedModel[resource.dictEmbeddedModel.Keys.First()][0].arrayRef[0].id, resourceLoaded.dictEmbeddedModel[resource.dictEmbeddedModel.Keys.First()][0].arrayRef[0].id);
            //Assert.AreEqual(resource.dictEmbeddedModel[resource.dictEmbeddedModel.Keys.Skip(1).First()][1].stringProperty, resourceLoaded.dictEmbeddedModel[resource.dictEmbeddedModel.Keys.Skip(1).First()][1].stringProperty);
        }