Почему мой int читается как 0 из хранилища таблиц Azure, а не как сохраненное значение? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь прочитать значения, которые я сохранил в таблице хранения Azure.Когда я получаю сущность, в Fiddler я вижу, что ответ имеет правильное значение, то есть:

{
"odata.etag":"W/\"datetime'2019-01-24T20%3A23%3A58.3605274Z'\"",
"PartitionKey":"0029c461-74b9-47a7-955b-28e07b1905ab",
"RowKey":"09a79860-f568-481c-9641-9a1d53ebd678",
"Timestamp":"2019-01-24T20:23:58.3605274Z",
"AdjustmentId":"[GUID]",
"CompanyName":"[CompanyNme]",
"CustomerId":"[GUID]",
"Date@odata.type":"Edm.DateTime",
"Date":"2019-01-24T20:23:49.9487324Z",
"FinalQuantity":35,
"Id":"[GUID]",
"InitialQuantity":36.0,
"OfferName":"[Product]",
"Requester":"[User]",
"Status":"Accepted",
"StatusMessage":"Created",
"Type":"QuantityAdjustment"
}

Однако, когда я работаю с этим повторением в моем коде C #, InitialQuantity устанавливается в 0Я использую Microsoft Azure WebJobs Extensions Storage v3.0.3 и WindowsAzure.Storage v9.3.3.

Ниже приведен класс сущностей, к которому привязан SDK хранилища Azure:

public class Transaction : TableEntity, ITransaction
    {
/// <summary>
        /// Gets or sets the adjustment identifier.
        /// </summary>
        /// <value>The adjustment identifier.</value>
        public string AdjustmentId { get; set; }

        /// <summary>
        /// Gets or sets the name of the company.
        /// </summary>
        /// <value>The name of the company.</value>
        public string CompanyName { get; set; }

        /// <summary>
        /// Gets or sets the customer identifier.
        /// </summary>
        /// <value>The customer identifier.</value>
        public string CustomerId { get; set; }

        /// <summary>
        /// Gets or sets the Transaction's date. Should be generated on creation.
        /// </summary>
        /// <value>The date.</value>
        public DateTime? Date { get; set; }

        /// <summary>
        /// Gets or sets the final quantity following the transaction.
        /// </summary>
        /// <value>The final quantity.</value>
        public int FinalQuantity { get; set; }

        /// <summary>
        /// Gets or sets the transaction identifier. Should be a GUID in string format. This is
        /// generated when a new Transaction is created.
        /// </summary>
        /// <value>The identifier.</value>
        public string Id { get; set; } = Guid.NewGuid().ToString().ToLower();

        /// <summary>
        /// Gets or sets the initial quantity.
        /// </summary>
        /// <value>The initial quantity.</value>
        public int InitialQuantity { get; set; }

        /// <summary>
        /// Gets or sets the offer identifier.
        /// </summary>
        /// <value>The offer identifier.</value>
        public string OfferId { get; set; }

        /// <summary>
        /// Gets or sets the name of the offer.
        /// </summary>
        /// <value>The name of the offer.</value>
        public string OfferName { get; set; }

        /// <summary>
        /// Gets or sets the requester.
        /// </summary>
        /// <value>The requester.</value>
        public string Requester { get; set; }

        /// <summary>
        /// Gets or sets the status. Set to pending by default.
        /// </summary>
        /// <value>The status.</value>
        public string Status { get; set; } = TransactionStatus.Pending;

        /// <summary>
        /// Gets or sets the status message.
        /// </summary>
        /// <value>The status message.</value>
        public string StatusMessage { get; set; }

        /// <summary>
        /// Gets or sets the type. Should be set using the constants in the <see
        /// cref="T:LicenseAdjustmentManagement.Infrastructure.TransactionTypes"/> class.
        /// </summary>
        /// <value>The type.</value>
        public string Type { get; set; }

public string ToJson()
        {
            return JsonConvert.SerializeObject(this);
        }
}

Код, который вызывает сущности.

var storageAccount = CloudStorageAccount.Parse("[ConnectionString]");
var tableClient = storageAccount.CreateCloudTableClient();
var transactionsTable = tableClient.GetTableReference("Transactions");

var query = TableQuery<Transaction>().Where(TableQuery.GenerateFilterCondition("Id", QueryComparisons.Equal, "[GUID]"));

var results = await transactionsTable.ExecuteQuerySegmentedAsync(query, default(TableContinuationToken)).AsEnumerable();

var transaction = results.First();

Все остальные значения читаются правильно, но InitialValue всегда равно 0. Любые предложения?

Редактировать: Как предложено KSib ниже, InitialValueсериализуется как decimal или double, поэтому, когда он десериализуется как int, он получает значение по умолчанию int, 0.Любая идея, почему эта вещь сериализуется как decimal, когда она объявлена ​​как в int?

1 Ответ

0 голосов
/ 04 февраля 2019

Вы пытаетесь десериализовать десятичное число в int, предположительно, и вместо того, чтобы выдавать исключение, я собираюсь предположить, что оно просто устанавливает свойство в default(int), которое равно 0

...