public async Task <int> ReloadLedgerHistoryAsync()
        {
            while (!StartWork())
            {
                await Task.Delay(1000);
            }

            try
            {
                using (var context = CreateContext())
                {
                    var offset = 0;
                    var data   = await _b2C2RestClient.GetLedgerHistoryAsync(offset, 100);

                    _log.Info($"Current offset={offset}; load more {data.Count}");

                    var query = $"TRUNCATE TABLE {Constants.Schema}.{Constants.LedgersTable}";
                    _log.Info($"TRUNCATE TABLE {Constants.Schema}.{Constants.LedgersTable}");

                    await context.Database.ExecuteSqlCommandAsync(query);

                    var list = new HashSet <string>();

                    while (data.Any())
                    {
                        var items = data.Select(e => new LedgerEntity(e)).Where(e => !list.Contains(e.TransactionId)).ToList();
                        context.Ledgers.AddRange(items);
                        await context.SaveChangesAsync();

                        foreach (var i in items)
                        {
                            list.Add(i.TransactionId);
                        }

                        offset += data.Count;

                        data = await GetDataFromB2C2(offset);

                        _log.Info($"Current offset={offset}; load more {data.Count}");
                    }

                    return(offset);
                }
            }
            finally
            {
                StopWork();
            }
        }
        //[Fact]
        public async void LedgerTest()
        {
            var result = await _restClient.GetLedgerHistoryAsync();

            Assert.NotNull(result);
            Assert.NotEmpty(result);
            foreach (var ledgerLog in result)
            {
                Assert.NotEmpty(ledgerLog.TransactionId);
                Assert.NotEmpty(ledgerLog.Reference);
                Assert.NotEmpty(ledgerLog.Currency);
                Assert.NotEqual(0, ledgerLog.Amount);
                Assert.NotEmpty(ledgerLog.Type);
                Assert.NotEqual(default(DateTime), ledgerLog.Created);
            }
        }
        public async Task <int> ReloadLedgerHistoryAsync()
        {
            while (!StartWork())
            {
                await Task.Delay(1000);
            }

            try
            {
                using (var context = CreateContext())
                {
                    var ledgerRequest = new LedgersRequest {
                        Limit = 100
                    };
                    string transactionId = null;

                    if (_enableAutoUpdate)
                    {
                        var last = context.Ledgers.OrderByDescending(x => x.Created).FirstOrDefault();
                        if (last != null)
                        {
                            ledgerRequest.CreatedAfter = last.Created.AddHours(-1);
                            transactionId = last.TransactionId;
                        }
                    }

                    var data = await _b2C2RestClient.GetLedgerHistoryAsync(ledgerRequest);

                    _log.Debug($"Current cursor = null; get data after transactionId = {(transactionId ?? "null")}; load more {data.Data.Count}");

                    int  totalCount = 0;
                    bool finish     = false;

                    while (!finish || data.Data.Count > 0)
                    {
                        var items = new List <LedgerEntity>();

                        foreach (var item in data.Data)
                        {
                            foreach (var assetMapping in _assetMappings)
                            {
                                item.Currency = item.Currency.Replace(assetMapping.Key, assetMapping.Value);
                            }

                            items.Add(new LedgerEntity(item));
                        }

                        foreach (var item in items)
                        {
                            if (!string.IsNullOrEmpty(transactionId) && item.TransactionId == transactionId)
                            {
                                finish = true;
                                break;
                            }

                            totalCount++;
                            context.Ledgers.Add(item);
                        }

                        await context.SaveChangesAsync();

                        if (finish)
                        {
                            _log.Debug($"Finish loading to transactionId = {transactionId}. Loaded {totalCount} records");
                            break;
                        }

                        ledgerRequest.Cursor = data.Next;
                        data = await GetDataFromB2C2(ledgerRequest);

                        if (string.IsNullOrEmpty(data.Next))
                        {
                            finish = true;
                        }

                        _log.Debug($"Current cursor = {ledgerRequest.Cursor}; next cursor: {ledgerRequest.Cursor}; load more {data.Data.Count}");
                    }

                    return(totalCount);
                }
            }
            finally
            {
                StopWork();
            }
        }